「Poetize3」导弹防御塔
所有导弹都有相同的匀速飞行速度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」导弹防御塔的更多相关文章
- joyoi1935 「Poetize3」导弹防御塔
#include <iostream> #include <cstring> #include <cstdio> #include <queue> #i ...
- [tyvj1935 Poetize3]导弹防御塔 (二分图多重匹配)
传送门 Description Freda控制着N座可以发射导弹的防御塔.每座塔都有足够数量的导弹,但是每座塔每次只能发射一枚.在发射导弹时,导弹需要T1秒才能从防御塔中射出,而在发射导弹后,发射这枚 ...
- CH6803 导弹防御塔
6803 导弹防御塔 0x60「图论」例题 背景 Freda的城堡-- "Freda,城堡外发现了一些入侵者!" "喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛l ...
- bzoj3035: 导弹防御塔
Description Freda的城堡——“Freda,城堡外发现了一些入侵者!”“喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~”“可是入侵者已经接近城堡了呀!”“别担心,rain ...
- 【NOIP2013模拟】导弹防御塔
题目 Freda的城堡-- "Freda,城堡外发现了一些入侵者!" "喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~" "可是入侵者 ...
- Codevs2490 导弹防御塔
2490 导弹防御塔 2490 导弹防御塔 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master 题目描述 Description Freda的城堡—— ...
- contest hunter 6803 导弹防御塔
没什么好写的.写写这题吧 拆点,把一个防御塔拆成m个,表示第i次攻击.瞎yy就好啊 #include<cstdio> #include<iostream> #include&l ...
- 【CH6803】导弹防御塔
题目大意:给定 N 座塔,M 个怪物,每座塔一次可以发射一枚导弹,发射导弹有发射时间和冷却时间,每座塔和每只怪物有自己的二维坐标,所有导弹有一个共同的速度,求至少需要多长时间才能将所有怪物消灭. 题解 ...
- JoyOI1935 导弹防御塔
原题链接 首先可以二分答案,然后考虑检验答案. 我们可以对炮塔进行拆点,即能发射\(x\)颗导弹就拆成\(n\times x\)个点,作为一个集合,另一个集合则是\(m\)个侵入者,然后对于能在剩余时 ...
随机推荐
- GUI编程笔记(java)11:使用Netbeans工具进行GUI编程
Netbeans工具:是基于java语言进行GUI界面设计的工具 Visual Studio工具:是基于C#语言进行GUI界面设计的工具
- iOS Multiview Applications
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...
- oracle:变长数组varray,嵌套表,集合
创建变长数组类型 ) ); 这个变长数组最多可以容纳两个数据,数据的类型为 varchar2(50) 更改元素类型的大小或精度 可以更改变长数组类型和嵌套表类型 元素的大小. ALTER TYPE ...
- 关于禁止ViewPager预加载问题【转】
转自:http://blog.csdn.net/qq_21898059/article/details/51453938#comments 我最近上班又遇到一个小难题了,就是如题所述:ViewPage ...
- ASP.NET 微信支付
一.在支付前期,我们需要获取用户的OpenId,此块内容只针对于JSAPI(微信中直接支付)才需要,如果生成二维码(NATIVE)扫描支付,请跳过此步骤 思路大致是:获取用户的code值 > 根 ...
- 一款js、css压缩工具yuicompressor
//压缩JS java -jar yuicompressor-.jar --type js --charset utf- -v src.js > packed.js //压缩CSS java - ...
- How to Make LastPass Even More Secure with Google Authenticator
Google Authenticator LastPass supports Google Authenticator, which is officially available as an app ...
- 使用cocoapods管理第三方类库
前言 在iOS项目中使用第三方类库可以说是非常常见的事,但是要正确地配置他们有时候是非常繁琐的事情,幸运的是CocoaPods是一个很好的解决方案. 什么是CocoaPods CocoaPods是OS ...
- 微软SQLHelper.cs类
using System; using System.Data; using System.Xml; using System.Data.SqlClient; using System.Collect ...
- poj 1087.A Plug for UNIX (最大流)
网络流,关键在建图 建图思路在代码里 /* 最大流SAP 邻接表 思路:基本源于FF方法,给每个顶点设定层次标号,和允许弧. 优化: 1.当前弧优化(重要). 1.每找到以条增广路回退到断点(常数优化 ...