Codeforces Round #521 (Div. 3) D. Cutting Out
Posted heyuhhh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #521 (Div. 3) D. Cutting Out相关的知识,希望对你有一定的参考价值。
D. Cutting Out
题目链接:https://codeforces.com/contest/1077/problem/D
题意:
给你n个数,现在要你选k个数出来,并且能够从这n个数种选取尽量多的这k个数。
题解:
一开始想的贪心+模拟,然后写崩了...
其实这个题二分一下选几组就好了,因为要选几个数是固定了的,所以我们可以用二分来判断可行性(根据二分的x和每个数出现的次数来判断),即是否可以选够k个数,这个很容易办到。
然后最后统计一下每个数出现的个数,最后无脑选输出答案就行了。
代码如下:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e5+5; int n,k; int s[N],cnt[N]; vector <int> ans; bool check(int x){ ans.clear(); for(int i=1;i<=N-5;i++){ if(!cnt[i]) continue ; int need = min(cnt[i]/x,k-int(ans.size())); for(int j=1;j<=need;j++) ans.push_back(i); if(ans.size()==k) return true; } return false; } int main(){ scanf("%d%d",&n,&k); for(int i=1;i<=n;i++){ scanf("%d",&s[i]); cnt[s[i]]++; } int l=1,r=N,mid; int re; while(l<r){ mid=l+r>>1; if(check(mid)){ l=mid+1; re=mid; }else r=mid; } check(re); for(auto v:ans) printf("%d ",v); return 0; }
以上是关于Codeforces Round #521 (Div. 3) D. Cutting Out的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #521 (Div. 3)
Codeforces Round #521 Div. 3 玩耍记
CodeForces Round #521 (Div.3) E. Thematic Contests
CodeForces Round #521 (Div.3) C. Good Array