描述 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. Building Local Unit Tests

    If your unit test has no dependencies or only has simple dependencies on Android, you should run you ...

  2. padding and margin.

    padding is the space between the content and the border, whereas margin is the space outside the bor ...

  3. JS中escape 方法和C#中的对应

    在项目中遇到js中escape过的json字符串,需要在C#中对应模拟编码,记得原来遇到过这个问题,但是当时没记录下来方案, 于是又搜索了一番,发现别人说的都是HttpUtility.UrlEncod ...

  4. metalink下载补丁包

    以下截图 截取自 某 升级包中携带的 readme文档 把以上图片转换为 文字 Download and Install Patch Updates Refer to the My Oracle Su ...

  5. spring-quartz普通任务与可传参任务

    两者区别与作用: 普通任务:总调度(SchedulerFactoryBean)--> 定时调度器(CronTriggerFactoryBean) --> 调度明细自定义执行方法bean(M ...

  6. 计算机网络基础_01IP地址

    1,IP地址组成和分级分级 IP地址=网络地址+主机地址 32位,4段组成 A:最高位是0 ,1个字节的网络地址,3个字节的主机地址 B:最高位是10,2个字节的网络地址,2个字节的主机地址 C:最高 ...

  7. ccui.ScrollView 扩展

    大多数游戏都有背包这个东西. 道具列表通常用 ScrollView 来实现. 这个ScrollView内部有一个Layout, 滑动都是由移动这个Layout来实现. 道具摆放通常从上往下, 从左到右 ...

  8. SGU 101.Domino (欧拉路)

    时间限制: 0.5 sec 空间限制: 4096 KB 描述 多米诺骨牌,一种用小的方的木块或其他材料,每个都被一些点在面上标记,这些木块通常被称为骨牌.每个骨牌的面都被一条线分成两个   方形,两边 ...

  9. xubuntu14.04截图,彻底到Linux一个半月后记

        前言 自学计算机技术,越到后面,越依赖ubuntu,以致于很多时候都是一开机就打开虚拟机上的ubuntu10.04,Linux已经变得越来越重要了. 2014-04-17,ubuntu14.0 ...

  10. 在CentOS 7中轻松安装Atomic应用(atomicapp)

    sudo yum install docker atomic etcd kubernetes sudo systemctl enable docker.service sudo systemctl s ...