出模拟赛

题目

有三种难度的题目难度分别为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 三种难度的题目各一道。求你最多能出多少场模拟赛。

思路

二分查找
满足
E + EM >= num,
H + MH >= num,
M + EM +MH > = m 的情况

(有些不懂,如何考虑 E用了EM,EM数量减少了?)

代码

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        long E = sc.nextLong();
        long EM = sc.nextLong();
        long M = sc.nextLong();
        long MH =sc.nextLong();
        long H = sc.nextLong();
        long lo = 0;
        long hi = (E+EM+H+M+MH)/3;
        while(lo <= hi){
            long mid = (lo+hi)/2;
            if(check(E,EM,M,MH,H,mid)){
                lo = mid+1;
            }
            else{
                hi = mid-1;
            }
        }
        System.out.println(hi);
    }
    public static boolean check(Long a,Long b,Long c,Long d,Long e,Long num){
        if(a+b<num){
            return false;
        }
        else if(d+e < num){
            return false;
        }
        else if(b+c+d<num){
            return false;
        }
        return true;
    }
}

下面这个好理解一些

import java.util.*;

public  class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        //E,EM,M,MH,H。
        long  E = sc.nextLong(); //简单题
        long EM = sc.nextLong(); //简单+中等
        long  M = sc.nextLong(); //中等
        long MH = sc.nextLong(); //中等+困难
        long  H = sc.nextLong(); //困难
        long res = 0; //考试次数
        long l = 0 , r = (E + EM + M + MH + H ) / 3;
        while(l <= r){
            long mid = (l + r) / 2;
            if(find(mid,E,EM,M,MH,H)){
                res = Math.max(res,mid);
                l = mid + 1;
            }else{
                r = mid -1;
            }
        }
        System.out.println(res);
    }
    
    private static boolean find(long request, long E, long EM, long M, long MH, long H) {
        // 容易题不够,从EM里补
        if(E < request){
            long diff = Math.min(request - E, EM);
            E += diff;
            EM -= diff;
        }
        // 难题不够,从MH里补
        if(H < request){
            long diff = Math.min(request - H, MH);
            H += diff;
            MH -= diff;
        }
        // E,M,H的数量都满足了,则可以办request场比赛
        if((M + EM + MH) >= request && E >= request && H >= request)
            return true;
        return false;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小略略略

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

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

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

打赏作者

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

抵扣说明:

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

余额充值