CodeForces 1372D Omkar and Circle (前缀和)

题意:给一个奇数长度的数组,操作是选择一个位置,删除其相邻的数,并将该位置的数赋值为相邻数的和,求最终剩下的一个数字最大为多少。

题解:前缀和
注意我们并不是去删除最小的,如 100 10 1 10 100,其实答案是删除两个10,最大为201。而且我们删除的数一定不能是相邻的,若相邻,其实就是相当于多删除一位了。

既然不能相邻,那我们就是删除原数组中(n-1)/2个数。
我们发现保留的数中只有两个是相邻的,其他都是间隔,那么只需要遍历是哪两个数相邻即可,这里采用移动窗口的方法实现。

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;

int n;
ll  a[422222];
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%lld", &a[i]);
        a[i + n] = a[i];
    }
    for (int i = 3; i <= 2 * n; i++) a[i] += a[i - 2];
    ll ans = 0;
    for (int i = n + 1; i <= 2 * n; i++) ans = max(ans, a[i] - a[i - n - 1]);
    printf("%lld\n", ans);
    return 0;
}

你可能感兴趣的:(#,前缀和,前缀和)