P7917 [Kubic] Addition 题解
思路
求最大值,不是二分答案就是贪心。这里很难二分所以考虑贪心。很容易想到贪心策略,从左往右扫,右侧的数 \(<0\) 就减,右侧的数 \(>0\) 就加,如果右侧的数是 \(0\) 无所谓。
考虑证明。对于 \(2\) 个数(假设第一个是 \(x\),第二个是 \(y\))的情况明显有:
- 当 \(y\leqslant0\),\(x-y\geqslant x+y\)(这里取等于的时候 \(y=0\))
- 否则 \(x-y<x+y\)。
容易发现满足最优子结构的性质(或者说能够归纳证明),每次合并两个数都最优,最终的答案一定最优。
代码
掌握了思路完全不难写。
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n-1;i++){//依次进行合并
if(a[i+1]<0){//贪心策略,我这里把0归类到加
a[i+1]=a[i]-a[i+1];//是负数就减
}
else{
a[i+1]+=a[i];//非负数就加
}
}
cout<<a[n]<<endl;//输出第n个,即最终留下的数