题目描述:
正解:
贪心
解题报告:
听起来很简单的样子……其实挺难想到的QAQ
开始看这道题的时候真滴觉得好难啊……然后就看到大佬站了起来把方法讲了出来秒切题……同为高一为何大佬们就这么厉害我这——么蒻QAQ
不过大佬讲了方法之后还是懂了
有一个很神仙的想法就是,你可以理解为每个点周围的边都有半个是自己的,然后就会变成这样:
如果我只选了一个点,这条边上另一个点就一定是对手选了,那就是0.5-0.5=0
如果我两个都选了,那就是0.5+0.5=1
如果我两个都没选,那就一定是对手选了,所以是-0.5-0.5=-1
然后你就会惊喜地发现!这两个人的选择是互相独立互不干扰的了!(因为要求最优明白吧?)然后就很很很简单了(……吗?
来直接放代码!
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #define M 10100 6 using namespace std; 7 int n,m; 8 long long ans,a[M]; 9 int main() 10 { 11 int i,x,y,z; 12 cin>>n>>m; 13 for(i=1;i<=n;i++) 14 { 15 scanf("%d",&z); 16 ans-=z;a[i]=z<<1; 17 } 18 for(i=1;i<=m;i++) 19 { 20 scanf("%d%d%d",&x,&y,&z); 21 ans-=z;a[x]+=z;a[y]+=z; 22 } 23 sort(a+1,a+n+1); 24 for(i=2;i<=n;i+=2) 25 ans+=a[i]; 26 cout<<ans<<endl; 27 return 0; 28 }
对了……说个很迷的事儿……
我自己先做了遍,感觉非常对,但是交上去RE了
我不服气地对照题解,实在觉得没错,于是交了题解,AC了……恶魔妈妈买面膜……我这个是复制的题解(虽然我觉得我写的真滴没错QAQ