题目
有三种难度的题目难度分别为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;
}
}