CF #521 div.3 D Cutting Out

Cutting Out

 

题目大意: 选出 k 个数,要求这 k 个数组成的组合在原序列中出现次数最多,输出方案。

 

题解:

div.3 都不会做了,要加强了啊!!!

二分出现的次数 mid。然后用每个数出现的次数 整除 mid = x, x 就是对序列个数的贡献。

如果个数 >=k 符合条件。

最后从大到小扫一遍,取前k个。

 

贴代码:

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,i,j,k,l,r,m,x,y;
 4 const int N=200000;
 5 pair<int,int> a[N+1];
 6 int main()
 7 {
 8     for(cin>>n>>k; i<n; i++)
 9       cin>>x,a[x].first++,a[x].second=x;
10     sort(a,a+N+1);
11     for(x=0,l=1,r=n; l+1<r; )
12     {
13         m=(l+r)/2;
14         for(x=0,i=N; i>0; i--) x+=a[i].first/m;
15         x>=k?l=m:r=m;
16     }
17     for(i=N; i>0; i--)
18         for(j=a[i].first/l; j>0&&k-->0; j--)
19             cout<<a[i].second<<" ";
20 }
View Code

 

 

 

 

 

 

fighting fighting fighting!!!

 

posted on 2018-11-18 16:54  Frank-King  阅读(189)  评论(0编辑  收藏  举报