【LG P4643】阿狸和桃子的遊戲
阿新 • • 發佈:2021-10-11
題意簡述
我們有一個 \(n\) 點 \(m\) 邊的無向圖,有點權和邊權。現在兩個人將它按照自己的最優方案每次取一個點,分為兩部分,求出此時他們的分差。
思路
把邊權轉換為點權即可。具體來說,把一條邊的邊權各一半加到兩個頂點上,然後每個人選的時候,貪心的選取點權最大的點即可。
簡要證明:如果一條邊的兩個頂點被同一個人選上了,那麼它就會額外提供等同於邊權的貢獻;否則的話,兩個人每人都有一半邊權的收益,相當於這條邊誰也沒給,也是符合題意的。
程式碼
#include<bits/stdc++.h> using namespace std; const int N=1e4+5; int a[N]; int main() { int n,m; scanf("%d %d",&n,&m); for(int i=1; i<=n; i++) { scanf("%d",a+i),a[i]<<=1; } for(int i=1,x,y,z; i<=m; i++) { scanf("%d %d %d",&x,&y,&z),a[x]+=z,a[y]+=z; } sort(a+1,a+n+1); int ans=0; for(int i=n; i; i-=2) { ans+=a[i]-a[i-1]; } printf("%d",ans>>1); return 0; }
本文作者:AFewMoon,文章地址:https://www.cnblogs.com/Sam2007/p/15392618.html
本作品採用 知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議 進行許可。
限於本人水平,如果文章有表述不當之處,還請不吝賜教。