Freda 的城堡遭受了 M 个入侵者的攻击!

Freda 控制着 N 座导弹防御塔,每座塔都有足够数量的导弹,但是每次只能发射一枚。

在发射导弹时,导弹需要 T1 秒才能从防御塔中射出,而在发射导弹后,发射这枚导弹的防御塔需要 T2 分钟来冷却。

所有导弹都有相同的匀速飞行速度 V,并且会沿着距离最短的路径去打击目标。

计算防御塔到目标的距离 Distance 时,你只需要计算水平距离,而忽略导弹飞行的高度。

导弹在空中飞行的时间就是 (Distance/V) 分钟,导弹到达目标后可以立即将它击毁。

现在,给出 N 座导弹防御塔的坐标,M 个入侵者的坐标,T1,T2 和 V。

因为 Freda 的小伙伴 Rainbow 就要来拜访城堡了,你需要求出至少多少分钟才能击退所有的入侵者。

输入格式

第一行五个正整数 N,M,T1,T2,V。

接下来 M 行每行两个整数,代表入侵者的坐标。

接下来 N 行每行两个整数,代表防御塔的坐标。

输出格式

输出一个实数,表示最少需要多少分钟才能击中所有的入侵者,四舍五入保留六位小数。

数据范围

1≤N,M≤50,坐标绝对值不超过 10000,T1,T2,V 不超过 2000。

输入样例:

3 3 30 20 1
0 0
0 50
50 0
50 50
0 1000
1000 0

输出样例:

91.500000

分析:二分+拆点+匈牙利算法

那么对于当前的二分值 mid,需要判断能否在 mid 秒之内击退所有入侵者。

已知发射预热时间 t1、冷却时间 t2,我们容易计算出每座塔在 mid 分钟内最多能发射出多少枚导弹,记为 p。
把入侵者作为二分图的左部节点,每座防御塔拆成 p 个导弹,作为二分图的右部节点。
最终会有 m 个左部节点、n * p 个右部节点

因此,一座塔的 p 个导弹是不等价的,因此要拆点来解决。如果 mid 时间内,第 i 个入侵
者能被第 j 座塔的第 k 个导弹击中,那么就在第 i 个左部节点和第 (k - 1) *n + j 个右部节点之间连一条无向边。

然后用匈牙利算法求最大匹配数,若左部节点都能找到匹配,说明 mid 时间内能击退入侵者,二分左区间,否则二分右区间。

注意t1的单位是s,要转换成分钟

代码如下:

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <vector>
#include <math.h>
#include <map>using namespace std;
const double eps=1e-9;
typedef pair<int,int> PII;
PII a[55],b[55];
double dist[55][55];
bool st[55*55];
int match[55*55];
vector<int>adj[55];
int n,m;
double t1,t2,v;
double get_dist(int x1,int y1,int x2,int y2)
{double x=x1-x2,y=y1-y2;//cout<<x1<<" "<<x2<<" "<<y1<<" "<<y2<<endl;return sqrt(x*x+y*y);
}
bool dfs(int id)
{for(int i=0;i<adj[id].size();i++){int tem=adj[id][i];if(st[tem])continue;st[tem]=1;if(!match[tem]||dfs(match[tem])){match[tem]=id;return true;}}return false;
}
bool check(double mid)
{int p = (mid + t2) / (t1 + t2);p=min(m,p);for(int i=1;i<=m;i++){adj[i].clear();for(int j=1;j<=n;j++){for(int k=0;k<p;k++){if(k*t2+(k+1)*t1+dist[i][j]/v < mid)adj[i].push_back(n*k+j);}}}memset(match, 0, sizeof match);for(int i=1;i<=m;i++){memset(st,0,sizeof st);if(!dfs(i)) return false;}return true;
}
int main()
{cin>>n>>m>>t1>>t2>>v;t1/=60;for(int i=1;i<=m;i++){int x,y;cin>>x>>y;a[i]={x,y};//cout<<a[i].first<<" "<<y<<endl;}for(int i=1;i<=n;i++){int x,y;cin>>x>>y;b[i]={x,y};//cout<<x<<" "<<y<<endl;}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){dist[i][j]=get_dist(a[i].first,a[i].second,b[j].first,b[j].second);//cout<<" "<<i<<" "<<j<<" "<<dist[i][j]<<endl;}}double l=0,r=1e9;while(r-l>eps){double mid=(l+r)/2;if(check(mid))r=mid;else l=mid;}printf("%.6f",l);return 0;
}

374. 导弹防御塔相关推荐

  1. [tyvj1935 Poetize3]导弹防御塔 (二分图多重匹配)

    传送门 Description Freda控制着N座可以发射导弹的防御塔.每座塔都有足够数量的导弹,但是每座塔每次只能发射一枚.在发射导弹时,导弹需要T1秒才能从防御塔中射出,而在发射导弹后,发射这枚 ...

  2. 【NOIP2013模拟】导弹防御塔

    题目 Freda的城堡-- "Freda,城堡外发现了一些入侵者!" "喵-刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~" "可是入侵者已经 ...

  3. 导弹防御塔---二分图匹配《lyd算法进阶》

    题目描述 Freda控制着N座可以发射导弹的防御塔.每座塔都有足够数量的导弹,但是每座塔每次只能发射一枚.在发射导弹时,导弹需要T1秒才能从防御塔中射出,而在发射导弹后,发射这枚导弹的防御塔需要T2分 ...

  4. CH - 6803 导弹防御塔(二分图最大匹配-多重匹配(拆点法))

    题目链接:点击查看 题目大意:给出n个炮塔,再给出m个敌人,每个炮塔都可以持续发射导弹,不过发射导弹的时间是t1秒,炮塔冷却的时间是t2分钟,炮弹飞行的速度是v,炮塔和敌人之间的距离按照欧几里得距离计 ...

  5. 拦截导弹 导弹防御系统

    拦截导弹 & 导弹防御系统 拦截导弹 导弹防御系统 拦截导弹 题目链接:acwing1010. 拦截导弹 题目描述: 输入输出: 分析: 第一个问题为输出最长递减子序列,由于导弹数在1000以 ...

  6. 英雄联盟怎么解除小窗口_英雄联盟:老玩家都不知道的小技巧,一定要注意这些细节|英雄联盟|召唤师|防御塔|新英雄|亚索...

    英雄联盟:老玩家都不知道的小技巧,一定要注意这些细节 英雄联盟作为当下最火爆的游戏之一,已经陪伴大家走过了无数的春夏秋冬,如今英雄联盟已经迎来了越来越多的新英雄,随着英雄联盟里面的英雄不断的增多,越来 ...

  7. unity塔防游戏怪物转向_野生防御塔游戏下载-野生防御塔游戏安卓版 v1.0

    野生防御塔是一款塔防策略类型的游戏,经典好玩的塔防策略玩法等你来,在这开启一场刺激的塔防吧.你需要依靠塔防建筑抵挡怪物的攻击,同时也需要面对对手的偷袭.依靠击杀怪物获得的金币可以购买一些道具升级你的塔 ...

  8. UE5 官方案例Lyra全特性详解 6.生成防御塔

    UE5 官方案例Lyra全特性详解 0.前言 1.模型 2.防御塔出生点 2.1 ATurretPlayerStart 3.防御塔角色类 3.1 防御塔蓝图 4.控制器 4.1 控制器蓝图类 5.游戏 ...

  9. java游戏循环_利用Java循环语句实现攻击防御塔小游戏

    /* * 时间:2018-3-21 * 目的:practice * 内容:利用Java循环语句实现攻击防御塔小游戏 * 使用Java while语句实现一个英雄攻击防御塔的小程序,防御塔血量总计100 ...

最新文章

  1. 罗斯蒙特电磁流量计8723说明书_罗斯蒙特8712和8732E电磁流量计变送器的功能规格...
  2. 报错:out cannot be resolved【已解决】
  3. 利用MiddleGen-hibernate-r5生成hbm文件及POJO文件
  4. java Object类是可以接收集合类型的
  5. SpringMVC之源码分析--ThemeResolver(三)
  6. SAP BW顾问如何保持市场竞争力?
  7. 毕业论文范文计算机,计算机毕业论文范文参考
  8. org.apache.catalina.LifecycleException: Protocol handler start failed
  9. 【阅读】《番茄工作法图解》---让工作更高效
  10. 如何在 Mac 上设置 FaceTime?
  11. 深度置信网络(DBN)
  12. pwnablekr-asm-seccomp-sandbox
  13. jQuery插件库超级好用库
  14. 愿守内心宁静,砥砺此生修行
  15. keytool 错误: java.io.IOException: Keystore was tampered with, or password was incorrect----gt;解决方法
  16. 了解Java8中的parallelStream
  17. 解决win10睡眠后变卡的问题
  18. 一文彻底搞懂python面向对象编程(全网最全!!!)
  19. 非奇异矩阵的多种判断方式
  20. 关于京东API超级搜索接口

热门文章

  1. WIFI基础知识-2.4GZH的信号为什么比5GHZ的信号好
  2. 服务器gpt分区不能安装系统,安装Win10原版系统提示“Windows无法安装到GPT分区形式磁盘”怎么办...
  3. android 读取wps_Android 默认使用wps打开本地文档
  4. hive表分区上传数据出现的一个问题及解决思路
  5. 泛泰A850工程机与正式机分区表对比
  6. php登陆界面点登陆没有反应,ThinkPHP5实战的登录界面的登陆按钮点击之后没有任何反应怎么解决?...
  7. 《机器学习基础》学习笔记-1
  8. 计算机C语言二级操作题之编程题
  9. 码垛机器人模型图纸分享(附下载)
  10. for循环打印九九乘法表