看到官方视频和大家的写法基本上都用的是贪心算法,天数从前往后贪心,尽量使用前一天的食材。这与我的思路并不一致,那作为算法小白的我也来浅浅分享一下我的做法吧。
主要思路:天数从后往前模拟,如果食材不够就往前一天的借,前一天还不够就No了,前一天够的话,就自身减去借出的食材,重复上次操作,直到第二天向第一天借完(需要的话)。记得最后还需要检验第一天是否符合要求。
import java.io.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter out = new PrintWriter(System.out);
public static void main(String[] args) throws IOException {
int t = Integer.parseInt(br.readLine());
while (t-- > 0) {
String[] str = br.readLine().split(" ");
int n = Integer.parseInt(str[0]);
int x = Integer.parseInt(str[1]);
String[] str2 = br.readLine().split(" ");
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(str2[i]);
}
boolean flag = true;
for (int i = n - 1; i > 0; i--) {
if (arr[i] < x) {
if (arr[i - 1] < x - arr[i]) {
flag = false;
break;
}
arr[i - 1] -= (x - arr[i]); //我赛时出错的地方......(变量重复加减了)
}
}
if (arr[0] < x) {
flag = false;
}
if (flag) {
out.println("Yes");
} else {
out.println("No");
}
}
out.close();
}
}
这是我写的第一篇题解,如有不当还请大佬见谅。
当时赛场上没有检查出来一个小错误,导致无法AC,红温了......(所以这场竞赛我的发挥也不好、起码不符合预期)
赛后百思不得解,借助Claude才发现,得出经验教训:对于变量,如果有变化的话,后面运算中再出现这个变量就要记得此时的变量已经是变化后的了,如果需要使用变化前的值,需定义临时变量或者直接在使用的时候进行计算......

京公网安备 11010502036488号