题目:
和朋友一起吃火锅,有m个菜品,你的手速是n(即吃完一道菜,要经过时间n才能再去夹菜)。任一菜品下锅后,都需要经过对应时间才能熟,过时就不可口了。怎样可以吃到最多的可口的菜。
输入:
第1行:菜品数量m,手速n
第2-m行:每行两个数字,第一个数字代表下某菜的时间,第二个数字代表该菜下锅后到煮好需要的时间。
输出:
最多可以吃多少道菜
破题思路:
假设在时间点 A最后一次夹菜,从时间轴向前看,是否有时间点B也可以下筷子,如有,则代表在时间点A能吃到的菜数量比时间点B多1
上代码:
import java.util.*;
public class Main1 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int cai = scanner.nextInt();
int hand = scanner.nextInt();
scanner.nextLine();
//菜煮好的时间数组
int[] caishuleTemp = new int[cai];
int time=0;
for(int i=0;i< cai; i++){
int xiacai = scanner.nextInt();
int jingguo = scanner.nextInt();
scanner.nextLine();
//获取每个菜煮好的时间
caishuleTemp[i]= xiacai+jingguo;
//获取最后一道菜煮好的时间
time = Math.max(time, caishuleTemp[i]);
}
//括号里为将int[]转为Integer[]
List<Integer> caishule = Arrays.asList(
Arrays.stream(caishuleTemp).boxed().toArray(Integer[]::new));
//all[i]为在i秒夹最后一次菜,能吃到的菜数量
int[] all = new int[time+1];
for(int i=1;i<time+1; i++){
if(caishule.contains(i)){
//如果该时间点有菜煮好,则all[i]初始化为1
all[i]=1;
}
for(int j=i-hand;j>0;j--){
if(caishule.contains(j)){
//时间i比时间点j可以多吃一个菜
all[i]=Math.max(all[j]+1, all[i]);
break;
}
}
}
//排序后取最大值
Arrays.sort(all);
System.out.println(all[time]);
}
}