出模拟赛

这篇博客讨论了一种使用二分查找算法来解决如何在给定不同难度题目的情况下,最大化安排模拟赛数量的问题。文章首先介绍了题目的背景,即需要确保每场比赛包含Easy、Medium和Hard三种难度的题目各一道。然后,提供了两种不同的二分查找实现,检查给定数目是否能满足比赛需求。第一种实现直接检查条件,第二种实现通过调整题目类型来满足条件。最后,给出了如何优化比赛场次的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

有三种难度的题目难度分别为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、付费专栏及课程。

余额充值