codeforces 1373D

题目链接

题目大意:

给你一个数组(下标从0开始)

最多旋转一个子数列

问所有可能中偶数位置上的元素和的最大值

解题思路:

翻转无非是倒置  即偶变奇  奇变偶  但是区间里面是数字是不会变化的   数还是那些数  只是位置变了

所以我们只需遍历数组  更新奇数下标减去偶数下标的最大和   有两种情况

a[1]-a[0]   a[3]-a[1]  .......

a[1]-a[2]    a[3]-a[4]  ......

最后加上原本的偶数位置的元素和就行

代码如下

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<stack>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
ll a[maxn]; 
int main()
{
	int t;
	ll i,ans,sum,maxx,n;
	cin>>t;
	while(t--)
	{
		maxx=0;
		sum=0;
		ans=0;
		cin>>n;
		for(i=0;i<n;i++)
		{
			cin>>a[i];
			if(i%2==0)
			  sum+=a[i];
		}
		for(i=1;i<n;i+=2)
		{
			ans+=a[i]-a[i-1];
			maxx=max(ans,maxx);
			if(ans<0)
			  ans=0;
		}
		ans=0;
		for(i=2;i<n;i+=2)
		{
			ans+=a[i-1]-a[i];
			maxx=max(ans,maxx);
			if(ans<0)
			  ans=0;
		}
		sum+=maxx;
		cout<<sum<<endl;
	} 
	 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43819762/article/details/106980796