专栏文章
题解:P11723 [JOIG 2025] カードゲーム 4 / Card Game 4
P11723题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miq9cvx5
- 此快照首次捕获于
- 2025/12/04 01:05 3 个月前
- 此快照最后确认于
- 2025/12/04 01:05 3 个月前
题意简述:
给定长度为 的数列 ,要求提取 个数,若提取的数奇偶性相同,取其加和,否则答案为 。
思路:
简单的贪心。
设置两个数组,分别记录数列中的奇数和偶数,并且记录个数,此时分为如下几种情况:
- 若奇数,偶数个数均小于 ,此时无论如何选取,答案均为 。
- 若其中奇数或者偶数的个数小于 ,此时对于另一个数组进行排序,取其中最大的 个数。
- 否则,将两个数组均排序,并分别求最大的 个数,答案为二者最大值。
代码实现:
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
int a[2000001],b[2000001],c[2000001];
signed main(){
cin>>n>>k;
int cnt1=0;
int cnt2=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]%2==1) cnt1++,b[cnt1]=a[i]; //统计格式并记录。
else cnt2++,c[cnt2]=a[i]; //同上。
}
if(k>cnt1&&k>cnt2){
cout<<0<<endl;
}
else{
int res1=0,res2=0;
sort(b+1,b+cnt1+1); //排序
reverse(b+1,b+cnt1+1); //反序
for(int i=1;i<=k;i++){
res1+=b[i]; //求和
}
sort(c+1,c+cnt2+1);
reverse(c+1,c+cnt2+1);
for(int i=1;i<=k;i++){
res2+=c[i]; //求和
}
if(cnt1<k){ //判断情况
cout<<res2;
}
else if(cnt2<k){
cout<<res1;
}
else{
cout<<max(res1,res2); //取最大值
}
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...