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;
}
posted @ 2025-03-20 22:27  Marinaco  阅读(25)  评论(0)    收藏  举报
//雪花飘落效果