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 }
fighting fighting fighting!!!