CF #521 div.3 D Cutting Out

Cutting Out

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

题解:

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

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

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

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

贴代码:

扫描二维码关注公众号,回复: 4131542 查看本文章
 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!!!

猜你喜欢

转载自www.cnblogs.com/Frank-King/p/9978422.html