看到官方视频和大家的写法基本上都用的是贪心算法,天数从前往后贪心,尽量使用前一天的食材。这与我的思路并不一致,那作为算法小白的我也来浅浅分享一下我的做法吧。

主要思路:天数从后往前模拟,如果食材不够就往前一天的借,前一天还不够就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才发现,得出经验教训:对于变量,如果有变化的话,后面运算中再出现这个变量就要记得此时的变量已经是变化后的了,如果需要使用变化前的值,需定义临时变量或者直接在使用的时候进行计算......