日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【GDKOI2004】使命的召唤

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【GDKOI2004】使命的召唤 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description
你玩過call of duty這個游戲嗎?這個游戲以諾曼底登陸為背景,假設你是盟軍的一員,身在前線去完成許多任務而粉碎納粹的野心。現在假設有一個任務,德軍有很多機槍陣地,火力很猛,如果不把它們摧毀就會對盟軍的推進造成很大損失,盟軍打算派出一些敢死隊員深入陣地把這些機槍陣地炸毀,當然,敢死隊員會有很大的生命危險,所以盟軍的指揮官希望你能幫他把損失降到最少。

Input
輸入數據第一行是一個整數n(1<=n<=200),代表有多少個機槍陣地需要摧毀。然后接下來n行,每行兩個整數xi,yi,代表每個機槍陣地的坐標(0<=xi,yi<=30000),然后接著一個整數m,跟著有m行,每行兩個整數p和q(1<=p,q<=n,p<>q),代表機槍陣地p和機槍陣地q之間有路相連,敢死隊員炸掉一個機槍陣地之后,必須從當前的機槍陣地出發沿著路到達下一個x坐標比當前陣地大的陣地(因為機槍陣地的縱深方向是沿著x坐標遞增方向的),如果不存在這樣的陣地,那這名敢死隊員就完成任務了。簡單來說,一個敢死隊員可以空降到任意一個機槍陣地(設為a0),然后從這個陣地出發按照上面所述可以摧毀一系列機槍陣地(順序列為a0,a1,a2…ak),而這一系列機槍陣地的x坐標滿足(x0 < x1 < x2 < … < xk)。從安全和效率出發,每個敢死隊員可以帶任意個炸彈。任意兩個敢死隊員的路線不能有交點。現在問你怎么安排敢死隊員的路線,可以使到用最小數目的敢死隊員去完成這個艱巨的任務。

Output
輸出一個整數,就是所求的敢死隊員的最小數目。

Sample Input
4
25990 5850
8263 2957
1067 22231
4109 4577
3
4 1
2 4
1 3

Sample Output
2

Data Constraint
m<10000

Hint
解釋:
上面的例子最少需2個敢死隊員,1種方案是:1個摧毀陣地4后再去摧毀陣地2,1個敢死隊員摧毀陣地3后去摧毀陣地1。
.
.
.
.
.

分析

“交點”,并非是線與線的交點,不是計算幾何!!!
“任意兩個敢死隊員的路徑不能重復”是指一個點只走一次!!!
使用匈牙利算法

.
.
.
.
.

程序:
#include<iostream> #include<string.h> #include<algorithm> using namespace std; int x[201],y[201],n,m,ans,g[401][401],f[401]; bool b[401];bool work(int t) {int i;for (i=n+1;i<=2*n;i++)if (g[t][i]&&!b[i]) {b[i]=1;if (!f[i]||work(f[i])==true) {f[i]=t; return 1;}}return 0; }int main() {cin>>n;for (int i=1;i<=n;i++)cin>>x[i]>>y[i];cin>>m;for (int i=1;i<=m;i++){int u,v;cin>>u>>v;if (x[u]>x[v]) swap(u,v);g[u][n+v]=1;}for (int i=1;i<=n;i++){memset(b,0,sizeof(b));if (work(i)==true) ans++;}cout<<n-ans; }

轉載于:https://www.cnblogs.com/YYC-0304/p/9499921.html

總結

以上是生活随笔為你收集整理的【GDKOI2004】使命的召唤的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。