C. Game of Mathletes
题目链接:https://codeforces.com/contest/2060/problem/C
题意:
给定一个长度为n的数组和一个固定数值k。
每轮alice从中选择一个数字并擦除,bob选择一个数值并擦除
如果他们两个选择的数字加起来等于k,那么分数+1
alice要让得分尽量小,bob要让得分尽量大,求最终得分
并且n为偶数
思路:
alice总是趋向于选择 那些无法与其他数组合得到k/可以组合但是是多余的那几个 的数字
那么此时bob也会选择 那些无法与其他数组合得到k/可以组合但是是多余的那几个 的数字
这些数字是成对的
那么就剩下可以组合成k的数字对了
此时数字对个数即为最终分数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
int t;
int arr[maxn];
signed main()
{
ios::sync_with_stdio(false),cin.tie(0);
cin>>t;
while(t--){
map<int,int>mp;
int n,k;cin>>n>>k;
for(int i=0;i<n;i++){
int x;cin>>x;
mp[x]++;
arr[i]=x;
}
int ans=0;
for(int i=0;i<n;i++){
int v=min(mp[arr[i]],mp[k-arr[i]]);if(v<=0)continue;
if(arr[i]==k-arr[i])v/=2;
ans+=v;
mp[arr[i]]-=v;
mp[k-arr[i]]-=v;
}
cout<<ans<<endl;
}
return 0;
}

浙公网安备 33010602011771号