阿狸和桃子的游戏题解

阿狸和桃子的游戏题解

每一道代码简单的黑题都有着诡异的思想,真不知道出题者怎么想的。

而这道题的重点在于把边权转换为点权,

此题的方式是将边权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;
}
posted @ 2019-08-07 20:32  lsoi_ljk123  阅读(121)  评论(0编辑  收藏  举报