傳送門
Description
Freda控制著N座可以發射導彈的防御塔。每座塔都有足夠數量的導彈,但是每座塔每次只能發射一枚。在發射導彈時,導彈需要T1秒才能從防御塔中射出,而在發射導彈后,發射這枚導彈的防御塔需要T2分鐘來冷卻。
所有導彈都有相同的勻速飛行速度V,并且會沿著距離最短的路徑去打擊目標。計算防御塔到目標的距離Distance時,你只需要計算水平距離,而忽略導彈飛行的高度。導彈在空中飛行的時間就是 (Distance/V) 分鐘,導彈到達目標后可以立即將它擊毀。
現在,給出N座導彈防御塔的坐標,M個入侵者的坐標,T1、T2和V,你需要求出至少要多少分鐘才能擊退所有的入侵者。
第一行五個正整數N,M,T1,T2,V。
接下來M行每行兩個整數,代表入侵者的坐標。
接下來N行每行兩個整數,代表防御塔的坐標。
Output
輸出一個實數,表示最少需要多少分鐘才能擊中所有的入侵者,四舍五入保留六位小數。
3 3 30 20 1
0 0
0 50
50 0
50 50
0 1000
1000 0
Sample Output
91.500000
HINT
對于40%的數據,N,M<=20.
對于100%的數據, 1≤N≤50, 1≤M≤50,坐標絕對值不超過10000,T1,T2,V不超過2000.
Solution
二分答案
把入侵者當做左部點,向能在時間內打到它的導彈連邊,跑最大匹配
這是多重匹配的一種做法即:拆點
?//By Menteur_Hxy
#include <cmath>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
using namespace std;int read() {int x=0,f=1; char c=getchar();while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return x*f;
}const int N=60;
int n,m,tot;
int vis[N*N],fr[N*N];
double t1,t2,v;
double tim[N][N];
vector <int> V[N];
struct Poi{int x,y;}I[N],D[N];bool dfs(int x) {int siz=V[x].size();F(i,0,siz-1) { int v=V[x][i];if(!vis[v]) {vis[v]=1;if(!fr[v]||dfs(fr[v])) {// cout<<x<<" "<<v<<endl;fr[v]=x;return 1;}}}return 0;
}bool jud(double x) {tot=0;F(i,1,m) V[i].clear();F(i,1,m) F(j,1,n) {double now=0;F(k,0,m) {now=k*(t1+t2);if(x-(now+t1+tim[i][j])>1e-7) {// cout<<i<<" "<<j<<" "<<k<<endl;V[i].push_back(j*(m+1)+k-m-1);}else break;// cout<<j*(m+1)+k-m-1<<endl;}}memset(fr,0,sizeof(fr));F(i,1,m) {memset(vis,0,sizeof(vis));if(!dfs(i)) return 0;}return 1;
}int main() {n=read(),m=read(),t1=read()/60.0,t2=read(),v=read();F(i,1,m) I[i].x=read(),I[i].y=read();F(i,1,n) D[i].x=read(),D[i].y=read();F(i,1,m) F(j,1,n) tim[i][j]=sqrt((I[i].x-D[j].x)*(I[i].x-D[j].x)+(I[i].y-D[j].y)*(I[i].y-D[j].y))/v;// F(i,1,m) F(j,1,n) printf("tim[%d][%d]=%lf\n",i,j,tim[i][j]);double l=0,r=1000000,ans=r;while(r-l>1e-9) {double mid=(l+r)/2.0;// cout<<mid<<endl;if(jud(mid)) ans=min(ans,mid),r=mid;else l=mid;}printf("%.6lf",ans);return 0;
}
轉載于:https://www.cnblogs.com/Menteur-Hxy/p/9496609.html
總結
以上是生活随笔為你收集整理的[tyvj1935 Poetize3]导弹防御塔 (二分图多重匹配)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。