【bzoj2563】阿狸和桃子的游戏(贪心+构造)
题目传送门:bzoj2563
先膜拜一波PoPoQQQ的题解:BZOJ 2563 阿狸和桃子的游戏 贪心
其实我们可以这样看:把一条边的权值均分到两个端点,那么取到两个端点就能得到这条边的边权,如果只取一个就两个人抵消了。
于是直接算实际点权,排个序轮流取最大就行了。
(但是我还是看了PoPoQQQ的题解后按里面的分析方法写的)
代码:
#include<cstdio> #include<algorithm> #include<functional> #define maxn 10010 int val[maxn]; int n,m; int main() { scanf("%d%d",&n,&m); long long ans=0; for(int i=1;i<=n;i++){ scanf("%d",&val[i]); ans-=val[i]; val[i]*=2; } for(int i=1;i<=m;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); ans-=z; val[x]+=z; val[y]+=z; } std::sort(val+1,val+n+1,std::greater<int>()); for(int i=1;i<=n;i+=2)ans+=val[i]; printf("%lld\n",ans); }