题目链接:https://codeforces.com/problemset/problem/2062/C
题意:
给定一个序列a,允许两种操作(当序列a元素个数为1时无法进行):1.翻转整个数组 2.将数组变为差分数组
求任意操作(可以为0)下数组元素之和的最大值
思路:
发现差分后数组元素之和为:a[n]-a[1],即最后一个元素减去第一个元素,贪心的,我们想让每个阶段的元素之和最大,就要让操作2后的数组元素和尽可能大
因此如果a[n]<a[1],那么就翻转数组
每次操作都要进行最大值的记录
这题也可以完全枚举两种不同情况,翻转和不翻转情况下,数组元素之和,哪个大就按哪个办
其实这种贪心有点神秘的
记得开ll
void solve(){int n;cin>>n;vector<int>a;int ans=-llmax;int sum=0;for(int i=0;i<n;i++){int x;cin>>x;a.pb(x);sum+=x;}ans=max(ans,sum);while(a.size()!=1){sum=0;if(a.back()<a[0])reverse(a.begin(),a.end());queue<int>q;for(int i=0;i<a.size()-1;i++){q.push(a[i+1]-a[i]);sum+=a[i+1]-a[i];}a.clear();while(q.size()){a.pb(q.front());q.pop();}ans=max(ans,sum);}cout<<ans<<endl;
}