task1 T2 game

来源:互联网 发布:c语言编程培训班 编辑:程序博客网 时间:2024/06/05 15:42





把边权分为两半,加在端点上,那么若一个玩家选取了两个端点,他就能获得该边的边权,若两个玩家各选取了一个端点,那么相减之后相当于没有玩家获得该边的边权。因此把边权分为两半,加在端点上,然后按端点权值排序,交错取即可。


#include<bits/stdc++.h>#define MAXN 10005using namespace std;template <typename T> void read(T &x){x=0;int f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';x*=f;}int n,m;double w[MAXN];inline bool cmp(double x,double y){return x>y;}int main(){freopen("game.in","r",stdin);freopen("game.out","w",stdout);read(n),read(m);for(int i=1;i<=n;++i) cin>>w[i];for(int i=1;i<=m;++i){int x,y;double v;read(x),read(y),cin>>v;v/=2;w[x]+=v;w[y]+=v;}//for(int i=1;i<=n;++i) cout<<w[i]<<" ";cout<<endl;sort(w+1,w+n+1,cmp);//for(int i=1;i<=n;++i) cout<<w[i]<<" ";cout<<endl;double tot=0.0;for(int i=1;i<=n;i+=2){tot+=w[i];}for(int i=2;i<=n;i+=2){tot-=w[i];}cout<<tot<<endl; return 0;}



原创粉丝点击