1. 程式人生 > >codeforces round521 div3D題

codeforces round521 div3D題

這道題,其實是很水的二分題,關鍵是要想到二分什麼比較合適。

這道題要最大化陣列中每個數出現的次數,而且每個數出現的次數知道後,陣列中可以出現多少個合法的值也就知道了。

注意二分之後得出的最大出現次數之後,從cnt陣列中取出合法值,取出第k個值後return 0;

#include<bits/stdc++.h>
using namespace std;
int a[200010];
int cnt[200010];
int b[200010];
int tot;
int k;
bool check(int mid)
{
	int kk=0;
	for(int i=1;i<=tot;i++)
	{
		int num=cnt[b[i]]/mid;
		kk+=num;
	}
	return kk>=k;
}
int main()
{
	int n;
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		cnt[a[i]]++;
	}
    for(int i=1;i<=200000;i++)
    {
    	if(cnt[i])
    	  b[++tot]=i;
	}
	int l=1,r=200000;
	int best=0;
	while(l<=r)
	{
		int mid=(l+r)/2;
		if(check(mid))
		{
			l=mid+1;
			best=mid;
		}
		else
		{
			r=mid-1;
		}
	}
	int cntk=0;
	for(int i=1;i<=tot;i++)
	{
		int num=cnt[b[i]]/best;
		if(num)
		{
			for(int j=1;j<=num;j++)
			{
				printf("%d ",b[i]);
				cntk++;
				if(cntk==k)
				{
		          printf("\n");
				  return 0;
			    }
			}
		}
	}
	printf("\n");
}