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;
}
浙公网安备 33010602011771号