题目

Freda的城堡——

“Freda,城堡外发现了一些入侵者!”

“喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~”

“可是入侵者已经接近城堡了呀!”

“别担心,rainbow,你看呢,这是我刚设计的导弹防御系统的说~”

“喂...别卖萌啊……”

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

所有导弹都有相同的匀速飞行速度V,并且会沿着距离最短的路径去打击目标。计算防御塔到目标的距离Distance时,你只需要计算水平距离,而忽略导弹飞行的高度。导弹在空中飞行的时间就是 (Distance/V) 分钟,导弹到达目标后可以立即将它击毁。

现在,给出N座导弹防御塔的坐标,M个入侵者的坐标,T1、T2和V,你需要求出至少要多少分钟才能击退所有的入侵者。

分析

首先二分时间,接着,就可以吧每个防御塔分成g个点,g表示在二分出的时间内可以发射多少枚导弹,然后把每个分出来的点和每个入侵者比较一下,如果这个点在二分出的时间内可以咔擦掉这个入侵者,就将它们连一条边。

然后。。。

就最大匹配一下就可以啦!

最大匹配可以用网络流或者匈牙利,如果不嫌麻烦的话就用网络流吧。

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
using namespace std;
double t1,t2,v,a[60][60],lf[60][3],xhm[60][3];
int n,m,tot,next[800000],to[800000],last[1000000],xyl[800000];
bool used[800000];
double dis(double x,double y,double x1,double y1)
{
return sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y));
}
int bj(int x,int y)
{
next[++tot]=last[x];
last[x]=tot;
to[tot]=y;
}
bool find(int x)
{
int i,j,k,l;
for(i=last[x];i;i=next[i])
{
j=to[i];
if(!used[j])
{
used[j]=true;
if(xyl[j]==0 || find(xyl[j]))
{
xyl[j]=x;
return true;
}
}
}
return false;
}
bool ddx(double limit)
{
int i,j,k,l;
double cs=(limit-t1)/(t1+t2)+1;
tot=0;
memset(to,0,sizeof(to));
memset(last,0,sizeof(last));
memset(next,0,sizeof(next));
for(i=1;i<=n;i++)
for(j=0;j<int(cs);j++)
{
double time=j*(t1+t2)+t1;
for(k=1;k<=m;k++)
{
if(time+a[i][k]<=limit)
{
bj(int(n*j+i),int(cs*n+k));
bj(int(cs*n+k),int(n*j+i));
}
}
}
int ans=0;
memset(xyl,0,sizeof(xyl));
for(i=1;i<=int(n*cs+m);i++)
{
memset(used,0,sizeof(used));
if(find(i)) ans++;
}
return ans==m*2;
}
double rf()
{
double l=0,r=50000,mid;
int i,j,k;
for(i=1;i<=50;i++)
{
mid=(l+r)/2;
if(ddx(mid)) r=mid;
else l=mid;
}
return r;
}
int main()
{
scanf("%d%d%lf%lf%lf",&n,&m,&t1,&t2,&v);
t1=t1/60;
int i,j,k,l,x,y;
for(i=1;i<=m;i++)
{
scanf("%lf%lf",&xhm[i][1],&xhm[i][2]);
}
for(i=1;i<=n;i++)
{
scanf("%lf%lf",&lf[i][1],&lf[i][2]);
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
a[i][j]=dis(lf[i][1],lf[i][2],xhm[j][1],xhm[j][2])/v;
}
double ans;
ans=rf();
printf("%.6lf",ans);
}

【NOIP2013模拟】导弹防御塔的更多相关文章

  1. bzoj3035: 导弹防御塔

    Description Freda的城堡——“Freda,城堡外发现了一些入侵者!”“喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~”“可是入侵者已经接近城堡了呀!”“别担心,rain ...

  2. 「Poetize3」导弹防御塔

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

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

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

  4. CH6803 导弹防御塔

    6803 导弹防御塔 0x60「图论」例题 背景 Freda的城堡-- "Freda,城堡外发现了一些入侵者!" "喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛l ...

  5. Codevs2490 导弹防御塔

    2490 导弹防御塔 2490 导弹防御塔 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master         题目描述 Description Freda的城堡—— ...

  6. contest hunter 6803 导弹防御塔

    没什么好写的.写写这题吧 拆点,把一个防御塔拆成m个,表示第i次攻击.瞎yy就好啊 #include<cstdio> #include<iostream> #include&l ...

  7. 【CH6803】导弹防御塔

    题目大意:给定 N 座塔,M 个怪物,每座塔一次可以发射一枚导弹,发射导弹有发射时间和冷却时间,每座塔和每只怪物有自己的二维坐标,所有导弹有一个共同的速度,求至少需要多长时间才能将所有怪物消灭. 题解 ...

  8. JoyOI1935 导弹防御塔

    原题链接 首先可以二分答案,然后考虑检验答案. 我们可以对炮塔进行拆点,即能发射\(x\)颗导弹就拆成\(n\times x\)个点,作为一个集合,另一个集合则是\(m\)个侵入者,然后对于能在剩余时 ...

  9. joyoi1935 「Poetize3」导弹防御塔

    #include <iostream> #include <cstring> #include <cstdio> #include <queue> #i ...

随机推荐

  1. (转)深入理解Java:注解(Annotation)自定义注解入门

    向作者致敬! 转自:http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在 ...

  2. ElasticSearch入门 —— 集群搭建

    一.环境介绍与安装准备 1.环境说明 2台虚拟机,OS为ubuntu13.04,ip分别为xxx.xxx.xxx.140和xxx.xxx.xxx.145. 2.安装准备 ElasticSearch(简 ...

  3. 应用安全 - 软件漏洞 - sudo漏洞汇总

    sudo Potential bypass of Runas user restrictions(CVE-2019-14287 ) Date:2019.10.14 类型: sudo提权漏洞 影响版本: ...

  4. 应用安全 - CMS - vBulletin漏洞汇总

    SSV-15384 Date: 2004.11 漏洞类别: SQL 注入 SSV-15476 Date: 2005.2 漏洞类别: RCE SSV-15482 Date: 2005.2 类型: RCE ...

  5. Canvas入门06-线段与像素边界

    我们知道,使用以下2个API可以绘制一条线段: moveTo(x, y) 向当前路径中增加一条子路径,该子路径只包含一个点,此为线段的起始点 lineTo(x, y) 将线段的下一个点加入子路径中 c ...

  6. django 的多对多关系

    django里自带的多对多表创建 其实就是两个多对一关系各自关联,在第三张表上 多对多的增加 add()可以传数值 例如 add(1)或数组 add(*[2,3]) 多对多反向操作 自己创建第三张表, ...

  7. 逆序单词 HIhoCoder 1366 字典树

    逆序单词 HIhoCoder 1366 字典序 题意 在英文中有很多逆序的单词,比如dog和god,evil和live等等. 现在给出一份包含N个单词的单词表,其中每个单词只出现一次,请你找出其中有多 ...

  8. Vim实用技巧(一)

    vim 命令按键规定 标记 含义 x 按一次 x dw 按一次 d, w dap 按一次 d, a, p 同时按 和 n g<C-]> 按 g, 然后同时按 和 ] <C-=> ...

  9. if练习

    练习: 1.简述变量命名规范 1.变量名由字母.下划线.数字组成 2.变量名不能以数字开头 3.变量不能使用python中的关键字 4.变量不能使用中文和拼音 5.区分大小写 6.变量名要具有描述性 ...

  10. Springboot+CAS单点登录

    一:安装CAS 下载cas:https://github.com/apereo/cas 1.1 将cas并打成war包.放入一个干净的tomcat中,启动tomcat测试: http://localh ...