CF2092C Asuna and the Mosquitoes

Posted on 2025-04-18 23:19  K_J_M  阅读(60)  评论(0)    收藏  举报

CF2092C Asuna and the Mosquitoes

题目描述

在 Asuna 生日时,她的 \(n\) 位仰慕者每人赠送了一座塔。第 \(i\) 位仰慕者赠送的塔高度为 \(a_i\)

Asuna 将礼物的美观度定义为 \(\max(a_1, a_2, \ldots, a_n)\)。她可以执行以下操作任意次数(包括零次):

  • 选择满足 \(1 \leq i \neq j \leq n\) 的两个下标,使得 \(a_i + a_j\) 为奇数且 \(a_i > 0\)。随后将 \(a_i\) 减少 \(1\),并将 \(a_j\) 增加 \(1\)

容易验证,在操作过程中塔的高度始终保持非负。请帮助 Asuna 求出经过任意次操作后可能达到的最大美观度。

Solution

考虑贪心。

首先如果我们选择了一个奇数,那么我们可以找到所有的偶数,然后加上他们,原因是奇数加上偶数还是奇数。

如果我们选择了一个偶数,那么我们可以加上每一个奇数减去一个一,最后再加上一个一,然后加上所有偶数。原因是我们先加上每一个奇数减去一个一,保持了原本的奇偶性,然后加上一个一使变为奇数,然后按照上面的操作加上所有的偶数。

我们对于每一个数进行如上操作即可得到最大值。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5+10;
int t,n,a[N];
signed main(){
    cin>>t;
    while(t--){
        cin>>n;
        int sum1=0,sum2=0,num1=0;
        for(int i=1;i<=n;++i){
            cin>>a[i];
            if(a[i]%2==1){
                sum1+=a[i];
                ++num1;
            }else{
                sum2+=a[i];
            }
        }
        int ans=0;
        for(int i=1;i<=n;++i){
            ans=max(ans,a[i]);
            if(a[i]%2==0){
                ans=max(ans,sum1-num1+1ll*(num1>0)+sum2*(num1>0));
            }else{
                ans=max(ans,a[i]+sum2);
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}