题解:CF2060C Game of Mathletes

题意:给你一个数列,A 先选,B 再选,若选出来两数相加为 $k$,则答案加一,A 想要答案小,B 希望答案大,都采用最佳策略,问答案为多少。

策略

A 是先手,所以考虑他随便选了一个,此时看 B,他一定会尽量选可以相加为 $k$ 的,如果没有可以选的就可以选同样对答案没有贡献的。

Result

答案是一组符合条件的数中数量少的那个然后相加。

Code

码风良好

#include<bits/stdc++.h>
using namespace std;
using LL=long long;
LL t,k,cnt,n,cn,sc,a[500005];
int main(){
	cin>>t;
	while(t--){
		memset(a,0,sizeof(a));
		sc=0;
		cin>>n>>k;
		for(int i=1;i<=n;i++){
			LL x;cin>>x;
			a[x]++;
		}
		for(int i=1;i<=k/2;i++){
			if(i+i==k){
				sc+=a[i]/2;
				continue;
			}
			sc+=min(a[i],a[k-i]);
		}
		cout<<sc<<endl;
	}
	return 0;
}