描述 Description
Freda控制着N座可以发射导弹的防御塔。每座塔都有足够数量的导弹,但是每座塔每次只能发射一枚。在发射导弹时,导弹需要T1秒才能从防御塔中射出,而在发射导弹后,发射这枚导弹的防御塔需要T2分钟来冷却。
所有导弹都有相同的匀速飞行速度V,并且会沿着距离最短的路径去打击目标。计算防御塔到目标的距离Distance时,你只需要计算水平距离,而忽略导弹飞行的高度。导弹在空中飞行的时间就是 (Distance/V) 分钟,导弹到达目标后可以立即将它击毁。
现在,给出N座导弹防御塔的坐标,M个入侵者的坐标,T1、T2和V,你需要求出至少要多少分钟才能击退所有的入侵者。

题解:
不太好想。

二分时间+二分图匹配

因为每个塔打每个敌人的时间点不同,能否达到也不同,而我们发现这个时间点只取决于这个该塔发射的第几次导弹。

所以我们把每个点拆成m个点,分别表示这个塔的第 i 发导弹,然后就可以根据当前时间+到达时间是不是小于二分的这个时间来建图。

用匈牙利求最大匹配,如果为m说明可行,缩小上界,否则缩小下界。

打的时候出现了出现了几个错误:

1)没有清空v数组

2)题目输入坑爹,t1的单位是s,其他的单位都是分钟。。。

3)。。。

现在还没有A掉,不过实在受不鸟了。。。

代码;

 #include<cstdio>

 #include<cstdlib>

 #include<cmath>

 #include<cstring>

 #include<algorithm>

 #include<iostream>

 #include<vector>

 #include<map>

 #include<set>

 #include<queue>

 #include<string>

 #define inf 1000000000

 #define maxn 200

 #define maxm 200

 #define eps 1e-10

 #define ll long long

 #define pa pair<int,int>

 #define for0(i,n) for(int i=0;i<=(n);i++)

 #define for1(i,n) for(int i=1;i<=(n);i++)

 #define for2(i,x,y) for(int i=(x);i<=(y);i++)

 #define for3(i,x,y) for(int i=(x);i>=(y);i--)

 #define mod 1000000007
#define sqr(x) (x)*(x)
#define num(x,y) (x-1)*(m)+y using namespace std; inline int read() { int x=,f=;char ch=getchar(); while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();} while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();} return x*f; }
int n,m,v[maxn*maxn],p[maxn*maxn];
double t1,t2,vv,t[maxn][maxn],d[maxn];
bool f[maxn*maxn][maxn];
struct rec{double x,y;}a[maxn],b[maxn];
inline bool find(int x,int y)
{
for1(i,n*m)
if(f[x][i]&&v[i]!=y)
{
v[i]=y;
if(p[i]==||find(p[i],y))
{
p[i]=x;
return ;
}
}
return ;
}
bool check(double x)
{
int ans=;//cout<<x<<endl;
memset(f,,sizeof(f));memset(p,,sizeof(p));memset(v,,sizeof(v));
for1(i,m)
for1(j,n)
for1(k,m)
if(d[k]+t[j][i]<=x)f[i][num(j,k)]=;
for1(i,m)if(find(i,i))ans++;
//cout<<ans<<endl;
return ans==m;
} int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); n=read();m=read();t1=read();t2=read();vv=read();t1/=;
for1(i,m)b[i].x=read(),b[i].y=read();
for1(i,n)a[i].x=read(),a[i].y=read();
for1(i,n)
for1(j,m)
t[i][j]=sqrt((sqr(a[i].x-b[j].x)+sqr(a[i].y-b[j].y)))/vv;
for1(i,m)d[i]=t1*i+t2*(i-);
double l=,r=inf,mid;
while(r-l>1e-)
{
mid=(l+r)/;
//printf("%lf %lf %lf\n",l,mid,r);
if(check(mid))r=mid;else l=mid;
}
printf("%.6lf",l); return ; }

数组开小查了一天啊!!!!!!!!!!!!!!!!!!!!!!!!!!!1

怎么这么容易反sb错误。。。。。。。

我是不是没救了TAT

代码:

 #include<cstdio>

 #include<cstdlib>

 #include<cmath>

 #include<cstring>

 #include<algorithm>

 #include<iostream>

 #include<vector>

 #include<map>

 #include<set>

 #include<queue>

 #include<string>

 #define inf 1000000000

 #define maxn 200

 #define maxm 200

 #define eps 1e-10

 #define ll long long

 #define pa pair<int,int>

 #define for0(i,n) for(int i=0;i<=(n);i++)

 #define for1(i,n) for(int i=1;i<=(n);i++)

 #define for2(i,x,y) for(int i=(x);i<=(y);i++)

 #define for3(i,x,y) for(int i=(x);i>=(y);i--)

 #define mod 1000000007
#define sqr(x) (x)*(x)
#define num(x,y) (x-1)*(m)+y using namespace std; inline int read() { int x=,f=;char ch=getchar(); while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();} while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();} return x*f; }
int n,m,v[maxn*maxn],p[maxn*maxn];
double t1,t2,vv,t[maxn][maxn],d[maxn];
bool f[maxn][maxn*maxn];
struct rec{double x,y;}a[maxn],b[maxn];
inline bool find(int x,int y)
{
for1(i,n*m)
if(f[x][i]&&v[i]!=y)
{
v[i]=y;
if(p[i]==||find(p[i],y))
{
p[i]=x;
return ;
}
}
return ;
}
bool check(double x)
{
int ans=;
memset(f,,sizeof(f));memset(p,,sizeof(p));memset(v,,sizeof(v));
for1(i,m)
for1(j,n)
for1(k,m)
if(d[k]+t[j][i]<=x)f[i][num(j,k)]=;
for1(i,m)if(find(i,i))ans++;
return ans==m;
} int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); n=read();m=read();t1=read();t2=read();vv=read();t1/=;
for1(i,m)b[i].x=read(),b[i].y=read();
for1(i,n)a[i].x=read(),a[i].y=read();
for1(i,n)
for1(j,m)
t[i][j]=sqrt((sqr(a[i].x-b[j].x)+sqr(a[i].y-b[j].y)))/vv;
for1(i,m)d[i]=(i-)*(t1+t2)+t1;
double l=,r=inf,mid;
while(r-l>1e-)
{
mid=(l+r)/;
if(check(mid))r=mid;else l=mid;
}
printf("%.6lf",l); return ; }

「Poetize3」导弹防御塔的更多相关文章

  1. joyoi1935 「Poetize3」导弹防御塔

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

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

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

  3. CH6803 导弹防御塔

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

  4. bzoj3035: 导弹防御塔

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

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

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

  6. Codevs2490 导弹防御塔

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

  7. contest hunter 6803 导弹防御塔

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

  8. 【CH6803】导弹防御塔

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

  9. JoyOI1935 导弹防御塔

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

随机推荐

  1. (总结)CentOS Linux搭建SVN Server配置详解

         PS:虽然在公司linux服务器上搭建过几次svn,但是时间长了,有些配置操作会忘掉,上网搜索的结果都不大满意,有幸在前几天看到一篇算是最满意的svn搭建文章,转载一下以备以后使用,原文地址 ...

  2. MVC+MEF+UnitOfWork+EF架构,网站速度慢的原因总结!(附加ANTS Memory Profiler简单用法)

    (最近使用内存分析工具ANTS Memory Profiler,以及其他网友提供的意见发现最终导致内存泄漏的就是MEF,在此特地更新下,与大家分享!最下面红色字体) 最近参考使用了郭明峰的一套架构来做 ...

  3. nest 'for' loop.

    /* nest for loop demo. Note that,'upside' triangle controls 'inner condition'. */ import kju.print.P ...

  4. Windows的计划任务

    阅读目录 一:什么是Windows的计划任务? 二:如何设置计划任务 三:高级设置计划任务 一:什么是Windows的计划任务? 在日常的工作中,我们都有一些固定的或临时性的工作,而每次在爱机前一坐, ...

  5. Express难点解析

    app.js 应用程序入口文件1.// view engine setup 设置视图引擎app.set('views', path.join(__dirname, 'views'));//告诉expr ...

  6. iOS 常见错误:CALayer position contains NaN: [14 nan]

    Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contai ...

  7. asp.net发布和更新网站

    我们一般使用ftp软件来更新网站,而更新之前的一个步骤就是发布项目.以下将讲解asp.net mvc如何发布网站. 打开项目 右键点击项目,选择“发布” 第一次发布前,需要配置一下发布配置文件:点击” ...

  8. set,multiset容器类型

    set和multiset会根据特定的排序准则,自动将元素排序.两者不同处在于multiset允许元素重复而set不允许. 一.集和多集(set 和multiset 容器类) 在使用set和multis ...

  9. SGU 137.Funny String

    题目描述 一个序列S1 S2 S3... Sn 如果满足 新序列 S1-1 S2 S3 ...Sn+1能够通过旋转的操作(不是翻转)来得到旧的序列,那么这个序列就叫做Funny序列.例如 1 2 1 ...

  10. SGU 138.Games of Chess

    时间限制:0.25s 空间限制:4M 题目: n个朋友在一起按照下面的规则依次下棋:在第一局游戏,n个人中的两个开始下棋.在第二局,第一局胜利的人将跟其他人下棋(也可能还是输了第一局人), 在第三局第 ...