题目链接: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;
}