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个,即最终留下的数
posted @ 2022-01-26 16:46  Shunpower  阅读(47)  评论(0编辑  收藏  举报