bzoj3035: 导弹防御塔

Description

Freda的城堡——
“Freda,城堡外发现了一些入侵者!”
“喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~”
“可是入侵者已经接近城堡了呀!”
“别担心,rainbow,你看呢,这是我刚设计的导弹防御系统的说~”
“喂...别卖萌啊……”

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

Input

第一行五个正整数N,M,T1,T2,V。
接下来M行每行两个整数,代表入侵者的坐标。
接下来N行每行两个整数,代表防御塔的坐标。

Output

输出一个实数,表示最少需要多少分钟才能击中所有的入侵者,四舍五入保留六位小数。

二分答案,网络流判定

#include<cstdio>
#include<cmath>
const int N=1000000;
int n,m,S,T;
int mx[64],my[64],nx[64],ny[64];
int es[N],enx[N],e0[N],ep,h[N],q[N],ev[N];
double t1,t2,v;
bool bfs(){
    for(int i=1;i<=T;i++)h[i]=0;
    int ql=0,qr=0;
    h[q[qr++]=S]=1;
    while(ql!=qr){
        int w=q[ql++];
        for(int i=e0[w];i;i=enx[i])if(ev[i]){
            int u=es[i];
            if(!h[u])h[q[qr++]=u]=h[w]+1;
        }
    }
    return h[T];
}
int dfs(int w,int f){
    if(w==T)return f;
    int c,used=0;
    for(int i=e0[w];i;i=enx[i])if(ev[i]){
        int u=es[i];
        if(h[u]!=h[w]+1)continue;
        c=f-used;
        if(c>ev[i])c=ev[i];
        c=dfs(u,c);
        ev[i]-=c;
        ev[i^1]+=c;
        used+=c;
        if(f==used)return f;
    }
    h[w]=0;
    return used;
}
inline void adde(int a,int b){
    es[ep]=b;enx[ep]=e0[a];ev[ep]=1;e0[a]=ep++;
    es[ep]=a;enx[ep]=e0[b];ev[ep]=0;e0[b]=ep++;
}
bool chk(double t){
    ep=2;
    S=n*m+m+1;T=S+1;
    for(int i=1;i<=T;i++)e0[i]=0;
    for(int i=1;i<=n;i++){
        for(int k=0;k<m;k++){
            adde(S,(i-1)*m+k+1);
        }
    }
    for(int i=1;i<=m;i++)adde(n*m+i,T);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            double x=mx[j]-nx[i],y=my[j]-ny[i];
            double tm=sqrt(x*x+y*y)/v;
            if(tm>t)continue;
            for(int k=0;k<m;k++)if(tm+t1+(t1+t2)*k<=t){
                adde((i-1)*m+k+1,n*m+j);
            }
        }
    }
    int ans=0;
    while(bfs())ans+=dfs(S,0x3f3f3f3f);
    return ans==m;
}
int main(){
    scanf("%d%d%lf%lf%lf",&n,&m,&t1,&t2,&v);
    for(int i=1;i<=m;i++)scanf("%d%d",mx+i,my+i);
    for(int i=1;i<=n;i++)scanf("%d%d",nx+i,ny+i);
    t1/=60.;
    double L=0,R=1e5;
    for(int i=0;i<44;i++){
        double M=(L+R)*.5;
        if(chk(M))R=M;
        else L=M;
    }
    printf("%.6f\n",L);
    return 0;
}
时间: 2024-10-11 17:05:14

bzoj3035: 导弹防御塔的相关文章

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

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

CH6803 导弹防御塔

6803 导弹防御塔 0x60「图论」例题 背景 Freda的城堡-- "Freda,城堡外发现了一些入侵者!" "喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~" "可是入侵者已经接近城堡了呀!" "别担心,rainbow,你看呢,这是我刚设计的导弹防御系统的说~" "喂...别卖萌啊--" 描述 Freda的城堡遭受了M个入侵者的攻击!Freda控制着N座导弹防御塔,每座塔都有足够数量的

AcWing374 导弹防御塔

二分图 此题看书的时候觉得特别难,实际的代码却非常简单 现在分析是什么让代码如此简单的: 首先预处理出第i个防御塔发射第j个导弹的时间(计算发射时间,不计冷却时间) 二分答案,判断时间mid内能否解决问题 利用vector建边,不用管标号的冲突,在二分图中十分方便(一般网络流可能就没办法了) 时间复杂度:\(O(n^4*log(T))\) 实际更快 #include<bits/stdc++.h> using namespace std; #define go(i,a,b) for(int i=

1048: 导弹防御系统

1048: 导弹防御系统 时间限制: 1 Sec  内存限制: 128 MB提交: 836  解决: 349[提交][状态][讨论版] 题目描述 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算这套系统最多能拦截多少导弹.拦截来袭导弹时,必须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹. 输入

2016级算法第三次上机-F.ModricWang的导弹防御系统

936 ModricWang的导弹防御系统 思路 题意即为:给出一个长度为n的序列,求出其最长不降子序列. 考虑比较平凡的DP做法: 令\(nums[i]\) 表示这个序列,\(f[x]\) 表示以第\(x\)个数为结尾的最长的不降子序列的长度,状态转移方程为: \[ f[i]=(\max{f[j]}+1) \;\;\;\;\;\;\; \mbox{when $nums[i]<=nums[j]$}\\] f中的最大值即为答案. 时间复杂度\(O(n^2)\),空间复杂度\(O(n)\) 当然也可

二分图的一些题目合集

妈蛋状态都被狗吃了,已经开始不自觉对着电脑发呆……被几道二分图的题亮瞎了双眼(这么弱可是gdkoi只剩一个月gdoi只剩100+天……!!) wikioi1222信与信封问题 二分图,但是判断两个合集中的某两个点是不是只能连在一起.那么我们就在跑一边最大匹配后直接用是否可以增广来判断.如果可以增广那么这两个点是有其他方式连在一起的,否则这两个点就必须连在一起.具体做法是先去掉这两个点的边,不过那么match数组也要跟着改一下. var map:array[0..200,0..200]of boo

远古守卫/cocos2d-x 源代码/塔防游戏/高仿王国保卫战

下载地址:spm=686.1000925.0.0.j3MZhz&id=550780702354" style="color:rgb(224,102,102)">下载地址 本源代码高度模仿IOS游戏王国保卫战,由国外IOS商业开发教程站点raywenderlich内部project师制作,有很完整的关卡设计,战斗流程,长达12个关卡,各种敌兵,怪物,箭塔,炮塔一应俱全,还有魔法系统,成就系统以及后台数据库.差点儿达到了能够上线的商业游戏级别. 代码严格规范,提供了

类Kingdom Rush塔防游戏的数值设计(一)&mdash;&mdash;玩法概述和基础战斗模型建立

玩法概述---- Kingdom Rush,即皇家守卫军,IronHide出的一款塔防游戏.其涂鸦的风格.独特的英雄和士兵系统.较为庞大的战斗场面,在塔防游戏中独树一帜,取得了巨大的成功. 在这里,基于Kingdom Rush的核心玩法,推拟出游戏所需的核心战斗数值(包括战斗内成长数值). 首先,需要明确游戏的玩法. 游戏大概的战斗场景如下 战斗地图区域划分 1.出怪点:2.预设路径:3.防御塔建造点:4.防守点 战斗单位划分 我方 1.防御塔:2.英雄:3.士兵 敌方 1.怪物 游戏玩法概述

使用Unity创建塔防游戏(Part1)

How to Create a Tower Defense Game in Unity - Part1 原文作者:Barbara Reichart 文章原译:http://www.cnblogs.com/le0zh/p/create-tower-defense-game-unity-part-1.html 参考了这篇文章,我打算做一些改进,以及翻译这篇文章的第2部分.如有不恰当的地方,欢迎各位指正. 塔防游戏极为流行,没有什么能比看着自己的防御塔消灭邪恶的入侵者更爽的事了. 你将会学习到 创建一