题目地址
题意:一串序列s,让你从这个序列中挑出一个序列t,t的长度给定,同时保证s中有尽可能多的t。
题解:
只要知道重复的次数,我们就能从s中找到对应的t,并且判断t的长度是否符合要求,并且t的长度如果能大于等于给定长度K,都是能保证符合要求的。二分找到这个重复次数即可。
#include<bits/stdc++.h>
using namespace std;
#define rep(a,b) for(int i=a;i<=b;i++)
#define red(a,b) for(int i=a;i>=b;i--)
#define ULL unsigned long long
#define LL long long
vector<int>s,t;
int A[300000];
map<int,int>M;
int check(int num,int n)
{
t.clear();
for(int i=0;i<s.size();i++)
{
int cnt=M[s[i]]/num;
for(int j=1;j<=cnt;j++)
t.push_back(s[i]);
}
return t.size();
}
int main()
{
int n,k;
cin>>n>>k;
int m=-1;
rep(1,n)
{
scanf("%d",&A[i]);
if(!M[A[i]])
s.push_back(A[i]);
M[A[i]]++;
m=max(M[A[i]],m);
}
int l=1,r=m;
int ans;
while(l<=r)
{
int mid=(l+r)/2;
// cout<<check(mid,n)<<endl;
if(check(mid,n)>=k)
{
l=mid+1;ans=mid;//得出最佳重复个数。
}//重复个数,判断
else r=mid-1;
}
// cout<<ans<<endl;
check(ans,n);
for(int i=0;i<k;i++)
{
cout<<t[i]<<" ";
}
system("pause");
}