牛客:出模拟赛

出模拟赛

题目:

有三种难度的题目难度分别为Easy,Medium,Hard。现在你总共有 E+EM+M+MH+H 道题,各个字符串的含义如下:
E表示有E道题目难度为Easy。
EM表示有EM道题目难度可以为Easy或Medium。
M表示有M道题目难度为Medium。
MH表示有MH道题目难度可以为Medium或Hard。
H表示有H道题目难度为Hard。
你要用这些题目出尽量多的模拟赛,为了保证题目质量且含有一定的区分度,每场模拟赛需要包含Easy,Medium,Hard 三种难度的题目各一道。求你最多能出多少场模拟赛。

方法:二分查找, C++

思路:

首先根据初始值找到二分查找的区间,最小值为low = 0
最大值为high = (E + EM + M + MH + H)/ 3
取出中间值mid = (low + high) / 2
判断当前mid值是否符合条件(是否能够出mid道模拟赛)
如果满足条件,则每个难度的题目最少都要大于等于mid,此时 low = mid + 1
如果不满足条件,则high = mid - 1

代码

#include <bits/stdc++.h>
using namespace std;

// 使用二分查找
bool check(long long E, long long EM, long long M, long long MH, long long H, long long mid){
    if(E + EM < mid){
        return false;
    }
    else if(MH + H < mid){
        return false;
    }
    else if(EM + MH + M < mid){
        return false;
    }
    return true;
}

int main(){
    long long E, EM, M, MH, H;
    cin >> E >> EM >> M >> MH >> H;
    long long low = 0, higt = (E + EM + M + MH + H)/3;
    while(low <= higt){
        long long mid = (low + higt) / 2;
        if(check(E, EM, M, MH, H, mid)){
            low = mid + 1;
        }else{
            higt = mid - 1;
        }
    }
    cout << higt << endl;
    return 0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

她的我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值