1. 程式人生 > 其它 >【LG P4643】阿狸和桃子的遊戲

【LG P4643】阿狸和桃子的遊戲

題意簡述

我們有一個 \(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 國際許可協議 進行許可。

限於本人水平,如果文章有表述不當之處,還請不吝賜教。