每日一练
📆Date: 2023年1月3日
✒️Author: SmartBoy
📓Classify: 蓝桥杯每日一题
🔖Language: Java
✨题目描述
一个视频游戏有n个关卡,每个关卡需要看ai分钟视频和玩bi分钟才可以通关。必须将前面的关卡通过后,才可以接着玩后面的关卡,当玩过一个关卡后,可以跳过前面的视频直接玩这个关卡。现在有人想通关x次,通过的关卡可以任意选择,请问他至少需要多少时间。
- 输入格式:
第一行包括两个正整数n,x
接下来n行每行两个整数ai,bi
- 输出格式:
一个正整数表示答案
- 样例输入1
3 4 3 4 2 3 4 2
- 样例输出1
18
- 样例输入2
10 1000000000 3 3 1 6 4 7 1 8 5 7 9 9 2 4 6 4 5 1 3 1
- 样例输出2
1000000076
🎉解题思路
样例一解释:共3个关卡,需要在这三个关卡中总共通关4次,可以一个关卡玩4次,也可以结合其他关卡总共完成4次(此处为本题的关键)。
此外,int型为32位,long型位64位,担心溢出,故用long型存储。
通过一个for循环来计算所有的n次方式,time来累加时间,然后比较每一关bi的大小,通过一个中间变量flag来记录本次循环的总通关时间,再比较n次的总通关时间取最小。其中flag为已通关的时间time+已通关关卡的最小bi*剩余的通关次数(x-i-1)。最后得到min进行输出即可。
🥇Java源码
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); // 关卡数 int x = sc.nextInt(); // 通关次数 long[][] arr = new long[n][2]; // 关卡时间 // 输入关卡时间ai与bi for (int i = 0; i < n; i++) { arr[i][0] = sc.nextInt(); arr[i][1] = sc.nextLong(); } long min = Long.MAX_VALUE; // 最短时间 long time = 0; // 通关时间 long minOnce = Long.MAX_VALUE; // 单关卡最短时间 for (int i = 0; i < n; i++) { time += arr[i][0] + arr[i][1]; // 比较bi的大小,取最小来通过这一关卡 if (minOnce > arr[i][1]) { minOnce = arr[i][1]; } long flag = time + minOnce * (x - i - 1); if (min > flag) { min = flag; } } System.out.println(min); } }