【题解】P8586 题解
P8586 题解
显然的贪心。
如果 ,直接统计有多少个不同个数即可,因为但凡选一个相同的都不满足。
否则,贪心地解决问题,过程如下:
-
若 的个数比 的个数小,直接更新 的个数,让它减去 的个数。
-
否则,让 的个数设为 ,因为它已经被匹配得干干净净了。
最后统计所有 到 的个数之和就是答案。(只统计较小的,因为较大的被拿去匹配了)
由于该方法每次总是拿小的去匹配大的,因此不会重复。
#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;
}

浙公网安备 33010602011771号