给你一个长度为 n 的数组(保证 n 为奇数),数组头尾相连变成一个环。现在你需要对这个环进行多次如下操作直到数组中只剩下一个数,使得最后这个数最大。
操作方法:选择数组中的一个数,将其替换为相邻左右两数的合,并且删除掉左右两边的数。
也就是说跟原数组相比,x 位置上的数变成 \(x-1\) 和 \(x+1\) 位置上的数的和(这里要注意数组首尾相连是一个环状的),而 \(x-1\) 和 \(x+1\) 位置上的数则删去,每次操作删除两个数,因为保证 n 为奇数,所以总共的操作共 \((n-1)/2\) 次。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Maxn = 2e5+10;
const int Inf = 0x7f7f7f7f;
int a[Maxn<<1];
ll Sum[Maxn<<1],tol;
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),a[i+n] = a[i],tol += a[i];
Sum[1] = a[1];
for(int i=2;i<=2*n;i++)
Sum[i] = Sum[i-2] + a[i];
ll Min = 1ll*Inf*Inf;
for(int i=1;i<=n;i++)
{
ll tmp = Sum[i+n-2] - Sum[i-1];
Min = min(Min,tmp);
}
printf("%lld\n",tol-Min);
return 0;
}
Codeforces Round 655 (Div. 2) D
原文:https://www.cnblogs.com/HexQwQ/p/13290226.html