codeforces round521 div3D題
阿新 • • 發佈:2018-11-17
這道題,其實是很水的二分題,關鍵是要想到二分什麼比較合適。
這道題要最大化陣列中每個數出現的次數,而且每個數出現的次數知道後,陣列中可以出現多少個合法的值也就知道了。
注意二分之後得出的最大出現次數之後,從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"); }