import java.util.Scanner; import java.util.ArrayList; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNextInt()) { // 注意 while 处理多个 case int n = in.nextInt(); int t = in.nextInt(); int c = in.nextInt(); ArrayList<Integer> arr = new ArrayList<Integer> (); ArrayList<Integer> dp = new ArrayList<Integer> (); dp.add(0); for(int i = 0; i < n; ++i) { arr.add(in.nextInt()); dp.add(arr.get(i) + dp.get(i)); } // 可以看出这是求出长度为c的子段和不超过t的个数 // dp[i]是从第一个元素累加到第i个的和,dp[1]等于第一个元素的值! // dp[i] - dp[i - c] 即长度为c的区间和,复杂度O(n) int ans = 0; for(int i = c; i <= n; ++i) { if(dp.get(i) - dp.get(i - c) <= t) ++ans; } System.out.println(ans); } } }
由于时间复杂度为O(n),故贪心可解,还可以进一步优化空间的思路:先计算一次从第一到第c个元素的区间和original_sum,然后使用一个临时变量维护每次左右区间端点右移一格的变化量delta,如果original_sum+delta <= t,则++ans,同样可解,空间复杂度降为O(1)