「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\)个侵入者,然后对于能在剩余时 ...
随机推荐
- [转] webpack debug in webstorm
先run build,然后用node server.js来做 WebStorm 11 adds support for debugging client-side apps built with We ...
- Java 自带MD5加密 Demo
package demo; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; pub ...
- SPFA 小优化*2
/* bzoj 2763 SPFA小优化 循环队列+SLF 顺面改掉自己之前手打qeueu的坏毛病*/ #include<iostream> #include<cstring> ...
- session marked for kill处理oracle中杀不掉的锁
ora-00031:session marked for kill处理oracle中杀不掉的锁 一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长 ...
- webServices 执行流程,(我是菜鸟,我怕谁,仅代表个人理解,欢迎各位大神们指导,不和您的胃口,请默默离开!!)
二.上图仅仅代表个人理解,下面以代码方式解释一下. (1) strtus.xml <?xml version="1.0" encoding="UTF-8" ...
- Wireshark提示没有一个可以抓包的接口
这是由于win下默认NPF服务是关闭的,需要以管理员的身份开启这个服务 Windows上安装wireshark时,会遇到NPF驱动无法启动的情况,一般如果采用管理员的方式就可以正常启动,或者是将NPF ...
- angular.js 简单的表达式
<!doctype html> <html> <head> <meta charset ="utf-8"> <script s ...
- javascript基础学习(五)
javascript之函数 学习要点: 函数的介绍 函数的参数 函数的属性和方法 系统函数 一.函数的介绍 1.函数就是一段javascript代码.可以分为用户自定义函数和系统函数. 如果一个函 ...
- 获取当前页面的url
var url = window.location.href; var b = url.substring(url.lastIndexOf('/')+1, url.length);
- Java hashCode 和 equals()
1 Object中定义的hashCode() public int hashCode() Returns a hash code value for the object. This method i ...