导弹防御塔 解题报告

导弹防御塔

背景

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

描述

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

输入

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

输出

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

solution

我们发现我们求的最大时间的最小值,因此考虑二分

由于每个防御塔可以发射多个导弹,但是又有时间限制,因此我们可以将每个防御塔的导弹拆开进行处理。。。

将问题转换为二分图模型:

左部点=敌人,右部点=敌人

对于每次二分答案\(mid\)

我们显然可以算出在\(mid\)时间内每个防御塔可以发射多少导弹

然后我们就将 合法的(每对导弹和敌人)之间连一条边

合法:在\(mid\)时间内导弹能够将敌人击退

然后看每个敌人是否都有一个导弹匹配即可

敌人有导弹匹配就意味着ta在\(mid\)时间内能被击退

code

double dis(double x1,double y1,double x2,double y2){
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
bool dfs(int x){
    for(int i=hd[x],y;~i;i=nxt[i]){
        if(vis[y=to[i]])continue;
        vis[y]=1;
        if(match[y]==-1||dfs(match[y])){
            match[y]=x; 
			return 1;
        }
    }
    return 0;
}
bool check(double mid){
    pre();
    for(int i=0;i<n;i++){//第i座塔 
    	for(int j=0;j<m;j++){//第i座塔的第j枚导弹 
    		for(int k=0;k<m;k++){//第k个敌人 
    			if(dis(a[k][0],a[k][1],b[i][0],b[i][1])/v+j*(t1+t2)+t1<=mid)//在mid时间内,第i座塔的第j枚导弹 可以打到 第k个敌人 
        		    add(k,i*m+j+m);
					add(i*m+j+m,k);
    		}
    	}
    }
    for(int i=0;i<m;i++){
        memset(vis,0,sizeof(vis));
        if(!dfs(i))return 0;
    }
    return 1;
}
int main(){
	cin.tie(0),cout.tie(0);
	ios::sync_with_stdio(false);
    cin>>n>>m>>t1>>t2>>v;
    t1/=60; //注意t1的单位是秒。。。好坑 
    for(int i=0;i<m;i++){
    	cin>>a[i][0]>>a[i][1];
    }
    for(int i=0;i<n;i++){
    	cin>>b[i][0]>>b[i][1];
    }
    double l=t1,r=M;
    while(l+eps<r){//二分最小时间 
        double mid=(l+r)/2;
        if(check(mid))r=mid;
        else l=mid;
    }
   	printf("%.6lf",l);
    return 0;
}

完结撒花❀

★,°:.☆( ̄▽ ̄)/$:.°★

posted @ 2022-09-02 20:27  _Youngxy  阅读(84)  评论(0)    收藏  举报