C. Cirno and Operations
题目链接: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;
}

浙公网安备 33010602011771号