扑克牌(cards)
扑克牌
思路
这题也是二分!!
我们二分有几套牌,然后再去检验是否符合,至于怎么想到的,不要问我,我也不知道
那么我们主要解决的就是check函数
我们将二分的套数和每种牌的数量进行比较,如果该种牌的数量大于mid,我们就不用管,如果小于的话我们就要将差值相加(代表我们要使用多少张鬼牌)
统计完后我们就判断对吧,我们判断我们统计出来所需要的鬼牌数量是否满足于小于题目给的鬼牌数量的同时也要小于mid,如果满足就返回mid(其实我最开始不懂这里,后来才知道只有统计出来的数小于mid,才可能满足题目的要求,即每套牌只能出现一张鬼牌)
代码就特别简单啊
代码
#include<bits/stdc++.h> #define ll long long #define FOR(i,a,b) for(register int i=a;i<=b;i++) #define ROF(i,a,b) for(register int i=a;i>=b;i--) using namespace std; int n,m; int a[80]; int scan() { int as=0,f=1; char c=getchar(); while(c>'9'||c<'0'){if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9'){as=(as<<3)+(as<<1)+c-'0';c=getchar();} return as*f; } bool chek(int mid) { ll tot=0; FOR(i,1,n) if(a[i]<mid) tot+=mid-a[i]; if(tot<=min(m,mid)) return 1; return 0; } int main() { n=scan(); m=scan(); int maxx=0; FOR(i,1,n) { a[i]=scan(); maxx=max(a[i],maxx); } int l=0,r=maxx+m+1,ans=0; while(l<r) { int mid=(l+r)>>1; if(chek(mid)) { ans=mid; l=mid+1; } else r=mid; } cout<<ans; return 0; }