「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\)个侵入者,然后对于能在剩余时 ...
随机推荐
- Building Local Unit Tests
If your unit test has no dependencies or only has simple dependencies on Android, you should run you ...
- padding and margin.
padding is the space between the content and the border, whereas margin is the space outside the bor ...
- JS中escape 方法和C#中的对应
在项目中遇到js中escape过的json字符串,需要在C#中对应模拟编码,记得原来遇到过这个问题,但是当时没记录下来方案, 于是又搜索了一番,发现别人说的都是HttpUtility.UrlEncod ...
- metalink下载补丁包
以下截图 截取自 某 升级包中携带的 readme文档 把以上图片转换为 文字 Download and Install Patch Updates Refer to the My Oracle Su ...
- spring-quartz普通任务与可传参任务
两者区别与作用: 普通任务:总调度(SchedulerFactoryBean)--> 定时调度器(CronTriggerFactoryBean) --> 调度明细自定义执行方法bean(M ...
- 计算机网络基础_01IP地址
1,IP地址组成和分级分级 IP地址=网络地址+主机地址 32位,4段组成 A:最高位是0 ,1个字节的网络地址,3个字节的主机地址 B:最高位是10,2个字节的网络地址,2个字节的主机地址 C:最高 ...
- ccui.ScrollView 扩展
大多数游戏都有背包这个东西. 道具列表通常用 ScrollView 来实现. 这个ScrollView内部有一个Layout, 滑动都是由移动这个Layout来实现. 道具摆放通常从上往下, 从左到右 ...
- SGU 101.Domino (欧拉路)
时间限制: 0.5 sec 空间限制: 4096 KB 描述 多米诺骨牌,一种用小的方的木块或其他材料,每个都被一些点在面上标记,这些木块通常被称为骨牌.每个骨牌的面都被一条线分成两个 方形,两边 ...
- xubuntu14.04截图,彻底到Linux一个半月后记
前言 自学计算机技术,越到后面,越依赖ubuntu,以致于很多时候都是一开机就打开虚拟机上的ubuntu10.04,Linux已经变得越来越重要了. 2014-04-17,ubuntu14.0 ...
- 在CentOS 7中轻松安装Atomic应用(atomicapp)
sudo yum install docker atomic etcd kubernetes sudo systemctl enable docker.service sudo systemctl s ...