Codeforces 1372D 贪心

       这道题我比赛的时候竟然没做出来。。。太菜了。。。
       题目给定 n n n 个数字( n n n 为奇数),围成一圈。每次操作去掉其中一个数,再将这个数字的相邻两个数字合并起来。重复操作直到只剩一个数字,问你最后得到的最大的数是多少。
       我们这样分析,合并的操作一定是 n − 1 2 \frac{n-1}{2} 2n1 次,那么我们贪心的想,我们能得到的最大的数字之和,一定是 n + 1 2 \frac{n+1}{2} 2n+1 个数字的和。所以每次删除的操作,都只能去掉一个不是合并后的数字。
Codeforces 1372D 贪心_第1张图片
       所以我们就要每次间隔一个来删除。不同的贪心操作就只是在于哪两个数字是连在一起的(他们会在删完 n − 1 2 \frac{n-1}{2} 2n1 个数字之后合并在一起,在圆圈上体现就是绕了一圈)。
       于是我们枚举这个两个数字连一起的位置。我们考虑 x x x 前面按奇数取,后面按偶数取;以及前面按偶数取,后面按奇数取。这样 x x x 的位置就是那连着的两个数字。 比如上图序列 14523 1 4 5 2 3 14523,我们枚举到 5 5 5 的位置时,前面取偶数的位置的数字,后面取奇数位置的数字,然后就得到了答案 4 + 5 + 3 = 12 4 + 5 + 3 = 12 4+5+3=12
       代码如下:

#include
using namespace std;
#define endl '\n'
typedef long long LL;
const int maxn = 2e5 + 5;
LL a[maxn];
LL odd[maxn], even[maxn];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n;
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
        odd[i] = odd[i - 1];
        even[i] = even[i - 1];
        if(i % 2) odd[i] += a[i];
        else    even[i] += a[i];
    }
    LL ans = 0;
    for(int i = 1; i <= n; i++){
        ans = max(ans, odd[i - 1] + even[n] - even[i] + a[i]);
        ans = max(ans, even[i - 1] + odd[n] - odd[i] + a[i]);
    }
    cout << ans << endl;

return 0;}

       不是题太难,是我不够贪

你可能感兴趣的:(题解)