辅导课堂在推进质量建设,需要分析每堂直播课的用户报障数量。
当连续多个课程的报障数量之和大于一个数s的时候,系统会发出报警。小猿想知道最长连续的没有触发报警的课程数量。
第一行两个整数 n,s
第二行 n 个整数,每个整数表示一次课程报障数量ai
对于 10% 的数据,满足 1 ≤ n ≤ 2 * 10^3
对于 100% 的数据,满足 1 ≤ n ≤ 2 * 10^6,0 ≤ ai ≤ 10^2
最长连续的没有触发报警的课程数量
3 2 1 1 3
2
前面两次课程分别为1,1 没有触发报警 所以答案是2
6 5 5 1 1 1 2 3
4
中间的课程打分 1 1 1 2之和等于5 没有触发报警
numbers=[ int(i) for i in input().split()] n,target=numbers[0],numbers[1] nums=[int(i) for i in input().split()] left,right,window_sum=0,0,0 res=0 for right in range(n): window_sum+=nums[right] while left<=right and window_sum>target: window_sum-=nums[left] left+=1 res=max(res,right-left+1) print(res)
import java.util.*; public class Main{ public static void main(String[] args){ Scanner scan = new Scanner(System.in); int N = scan.nextInt(); int S = scan.nextInt(); int[] num = new int[N]; for(int i=0;i<N;i++){ num[i] = scan.nextInt(); } int tem = S; int res = 0; //使用两个指针维护符合范围的数据 int left=0,right=0; while(right<N){ //不满足左移 while(num[right]>tem){ tem+=num[left++]; if(left>right) right=left; } //满足右移 tem-=num[right++]; res = Math.max(right-left,res); } System.out.print(res); } }
n, s = map(int, input().split(" ")) li = list(map(int, input().split(" "))) left = 0 result = 0 left_sum = li[left] for i in range(1, n): while left < i and left_sum > s: left_sum -= li[left] left += 1 left_sum += li[i] result = max(result, i - left) print(result)
import java.util.*; public class Main{ public static void main(String args[]){ Scanner scan = new Scanner(System.in); while(scan.hasNext()){ int n = scan.nextInt(); int bound = scan.nextInt(); int num[] = new int[n]; for(int i=0;i<n;i++) num[i] = scan.nextInt(); System.out.println(cal(num,bound)); } } public static int cal(int arr[],int bound){ int m = 0; int sum = 0; int idx = 0; ArrayDeque<Integer> Q = new ArrayDeque<>(); for(;idx<arr.length;idx++){ if(arr[idx]<=bound && (sum+arr[idx])<=bound){ sum+=arr[idx]; Q.offer(arr[idx]); }else{ m = Math.max(m,Q.size()); while(!Q.isEmpty()){ sum = sum-Q.poll(); if(sum+arr[idx]<=bound){ sum+=arr[idx]; Q.offer(arr[idx]); break; } } } } return m; } }
#include <iostream> using namespace std; int main(){ int n,s; cin>>n>>s; int *S = new int[n]; int left = 0; int sum = 0; int max_len = 0; for (int i=0;i<n;i++){ cin>>S[i]; sum+=S[i]; if (sum>s){ if (max_len < (i-left)){ max_len = i-left; } sum -= S[left]; left++; } } cout<<max_len; delete[] S; return 0; }
n,s = list(map(int,input().strip().split())) l = list(map(int, input().strip().split())) left, right = 0, 1 course_sum = l[0] res = 0 while left <= right and right < n: if course_sum <= s: res = max(res, right - left) else: course_sum -= l[left] left += 1 course_sum += l[right] right += 1 print(res)
import java.util.*; //二分查找 public class Main{ public static void main(String[] args){ Scanner input; int N, S, i; int[] A; input = new Scanner(System.in); while(input.hasNext()){ N = input.nextInt(); S = input.nextInt(); A = new int[N]; for(i = 0; i < N; i++){ A[i] = input.nextInt(); } System.out.println(new Main().Solution(A, N, S)); } } private int Solution(int[] A, int N, int S){ int[] sum; int ans, i, j; sum = new int[N]; sum[0] = A[0]; ans = sum[0] > S ? 0 : 1; for(i = 1; i < N; i++){ sum[i] = sum[i-1] + A[i]; if(sum[i] <= S) ans = i + 1; else{ j = i - find(sum, i - 1, sum[i] - S); ans = ans > j ? ans : j; } } return ans; } //找到不小于t的数的最小索引 private int find(int[] nums, int end, int t){ int i, j, mid; if(t > nums[end]) return end + 1; i = 0; j = end; while(j > i){ mid = (i + j) / 2; if(t > nums[mid]) i = mid + 1; else j = mid; } return i; } }