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;
}


posted @ 2025-01-20 16:10  Marinaco  阅读(67)  评论(0)    收藏  举报
//雪花飘落效果