【题解】P8586 题解

P8586 题解

显然的贪心。

如果 k=0k=0,直接统计有多少个不同个数即可,因为但凡选一个相同的都不满足。

否则,贪心地解决问题,过程如下:

  • ii 的个数比 i+ki + k 的个数小,直接更新 i+ki+k 的个数,让它减去 ii 的个数。

  • 否则,让 i+ki+k 的个数设为 00,因为它已经被匹配得干干净净了。

最后统计所有 00100000k100000-k 的个数之和就是答案。(只统计较小的,因为较大的被拿去匹配了)

由于该方法每次总是拿小的去匹配大的,因此不会重复。

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;

int p[N];

int main()
{
	int n, k;
	cin >> n >> k;
	for(int i = 1;i <= n;i++)
	{
		int t;
		cin >> t;
		p[t]++; //计数
	}
	if(!k)
	{
		int ans = 0;
		for(int i = 0;i <= 100000;i++) ans += (p[i] ? 1 : 0); //统计不同的数的个数
		cout << ans << endl;
	}
	else
	{
		int ans = 0;
		for(int i = 0;i <= 100000 - k;i++)
		{
			if(p[i])
			{
				if(p[i] < p[i + k]) //如果小
				{
					p[i + k] -= p[i]; 
				}
				else
				{
					p[i + k] = 0;
				}
			}
		}
		for(int i = 0;i <= 100000 - k;i++) //统计剩余的
		{
			ans += p[i];
		}
		cout << ans << endl;
	}
	return 0;
}
posted @ 2023-12-04 13:57  邻补角-SSA  阅读(20)  评论(0)    收藏  举报  来源