专栏文章
题解:CF2147D Game on Array
CF2147D题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minktuo1
- 此快照首次捕获于
- 2025/12/02 04:03 3 个月前
- 此快照最后确认于
- 2025/12/02 04:03 3 个月前
题解:CF2147D Game on Array
我们思考有哪些是两个人都可以获得的分数,容易发现,两个人都会优先选择奇数,因为考虑奇偶性,那么偶数的情况下,两个人获得的分数都是一样的。如果选择奇数的话,那么两个人就会有先后手的分差。
我们记录所有的奇数从大到小排序 ,对于先手的 Alice 她肯定一开始会选择 ,然后她就获得了先手的分数,但是这样 Bob 就有下次先手的机会,他肯定选择 ,两人的分数差距就这样你来我往的先后手,得到的分数。
对于统计两人总共的分数,我们把偶数的分数两人平分加上两个人在奇数你来我往的分数即可。
CPP#include<bits/stdc++.h>
#define int long long
#define rep(i,l,r) for(int i=l;i<=r;++i)
#define per(i,r,l) for(int i=r;i>=l;--i)
using namespace std;
int n;
map<int,int>mp;
void solve(){
cin>>n;
vector<int>s;
mp.clear();
rep(i,1,n){
int x; cin>>x;
++mp[x];
}
for(auto v:mp){
if(v.first&1) s.push_back(v.second);
}
sort(s.begin(),s.end(),greater<int>());
int f=1,ans1=0,ans2=0;
for(auto v:s){
if(f) ans1+=v,f=0;
else ans2+=v,f=1;
}
for(auto v:mp){
ans1+=(v.first/2)*v.second;
ans2+=(v.first/2)*v.second;
}
cout<<ans1<<' '<<ans2<<'\n';
}
signed main() {
int Q; cin>>Q;
for(;Q;--Q){
solve();
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...