阿狸和桃子的游戏题解
阿狸和桃子的游戏题解
每一道代码简单的黑题都有着诡异的思想,真不知道出题者怎么想的。
而这道题的重点在于把边权转换为点权,
此题的方式是将边权w平均分给被连接的两点u和v。
若u和v都被一人选择,则他的分数较不加边权前多了w/2+w/2=w,
若被不同的人选择,分数差多了(ans1+w/2)-(ans2-w/2)=ans1-ans2
并不会对答案有什么影响。
所以,最优策略? 肯定选择点权最大的了。
排序后依次选择即可。
#include<bits/stdc++.h>
using namespace std;
const int N=100006;
int n,m,t1,t2,t3;
double f[N],ans[2];
inline int read(){
int T=0,F=1; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') F=-1; ch=getchar();}
while(ch>='0'&&ch<='9') T=(T<<3)+(T<<1)+(ch-48),ch=getchar();
return F*T;
}
bool cmp(double u,double v){return u>v;}
int main(){
n=read(),m=read();
for(int i=1;i<=n;++i) t1=read(),f[i]=1.00*t1;
for(int i=1;i<=m;++i) t1=read(),t2=read(),t3=read(),f[t1]+=0.50000*t3,f[t2]+=0.5000000*t3;
sort(f+1,f+n+1,cmp);
for(int i=1;i<=n;++i) ans[i&1]+=f[i];
t1=(int)(ans[1]-ans[0]),printf("%d\n",t1);
return 0;
}