每日一题 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;
}
每日一题题解 文章被收录于专栏

每日一题题解的汇集

全部评论

相关推荐

11-11 16:40
已编辑
门头沟学院 人工智能
不知道怎么取名字_:这个有点不合理了,相当于已经毕业了,但还是没转正,这不就是白嫖
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务