输入
7 3
1 2 3 2 4 3 1
输出
1 2 3
输入
10 4
1 3 1 3 10 3 7 7 12 3
输出
7 3 1 3
输入
15 2
1 2 1 1 1 2 1 1 2 1 2 1 1 1 1
1 1
题意: 给定一个 n 和 n个数 问是否能够尽可能多在原序列删除的找出长度为k的序列 输出序列
题解 二分 最多可以删除的次数 最后 要更新一下结果 check(l-1) 因为二分的最后结果是 l-1次
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5+5;
int cnt[maxn];
int a[maxn], tot = 0;
int n, k;
int check(int x)//可以删除的次数
{
tot = 0;
int sum = 0;
for(int i=1; i<maxn; i++)//枚举 输入的数值
{
for(int j=x; j<=cnt[i]; j+=x)// 枚举对于当前数值删除的次数
{
sum++;
a[++tot]=i;
}
}
return sum;
}
int main()
{
scanf("%d%d", &n, &k);
for(int i=1; i<=n; i++)
{
int x;
scanf("%d", &x);
cnt[x]++;
}
int l = 1, r = 1e9;
while(l <= r)
{
int mid = (l + r)/2;//二分可以删除的次数
if(check(mid) >= k) l = mid + 1;
else r = mid - 1;
}
check(l-1);
for(int i=1; i<=k; i++)
printf("%d ", a[i]);
return 0;
}