思路
由于双方的操作后,操作后都是将操作数的和在放回去,所以可以用前缀和先处理了一下数组。
双方都想自己的分值比对方尽量大,所以第一个人一定拿的是最优。否则,对方拿了剩下的最优,再剩下的就一定不是最优的了。那么,我们可以第一次就使得利益最大化。
我们可以逆着遍历,不断的求计算的数和前缀和差的最大值(尽量使自己比对方的分值大)最后输出即可。
代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int o_o=200001;//注意数据范围
int n,n_i,a_s,a_a[o_o];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&n_i);//读入数列
a_a[i]=a_a[i-1]+n_i;//预处理,求前缀和
}
a_s=a_a[n];//赋初值,要逆着遍历保证最优情况
for(int i=n-1;i>=2;i--)a_s=max(a_s,a_a[i]-a_s);//注意:最少选两个数注意边界
printf("%d",a_s);//输出结果
return 0;
}