每日一题 6.4 [CQOI2010]扑克牌
[CQOI2010]扑克牌
https://ac.nowcoder.com/acm/problem/19916
这题我们可以推出来是单调的 所有就可以用二分来写
check函数就是判断joker能不能补完缺少的和是否会造成有两个joker在一套牌里面
代码有详细注释
#include <bits/stdc++.h>
#define ll long long
const int N=55;
using namespace std;
ll n,m,a[N];
bool check(ll mid){
ll tmp=min(mid,m);///防止补的joker比套数还多 说明一套有两个joker
for(int i=1;i<=n;i++){
tmp-=max(mid-a[i],0ll);///小于套数的数要用joker来补
if(tmp<0) return 0;///joker不够补了
}
return 1;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
ll l=1,r=1e9,ans;
while(l<=r){
ll mid=(l+r)/2;
if(check(mid)) ans=mid,l=mid+1;
else r=mid-1;
}
cout<<ans<<endl;
return 0;
}
每日一题题解 文章被收录于专栏
每日一题题解的汇集


查看9道真题和解析