专栏文章

题解: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

我们思考有哪些是两个人都可以获得的分数,容易发现,两个人都会优先选择奇数,因为考虑奇偶性,那么偶数的情况下,两个人获得的分数都是一样的。如果选择奇数的话,那么两个人就会有先后手的分差。
我们记录所有的奇数从大到小排序 a1>a2>a3ana_1>a_2>a_3\dots a_n,对于先手的 Alice 她肯定一开始会选择 a1a_1,然后她就获得了先手的分数,但是这样 Bob 就有下次先手的机会,他肯定选择 a2a_2,两人的分数差距就这样你来我往的先后手,得到的分数。
对于统计两人总共的分数,我们把偶数的分数两人平分加上两个人在奇数你来我往的分数即可。
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 条评论,欢迎与作者交流。

正在加载评论...