首页 > 试题广场 >

课程质量建设

[编程题]课程质量建设
  • 热度指数:717 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 100M,其他语言200M
  • 算法知识视频讲解
辅导课堂在推进质量建设,需要分析每堂直播课的用户报障数量。
当连续多个课程的报障数量之和大于一个数s的时候,系统会发出报警。小猿想知道最长连续的没有触发报警的课程数量。

输入描述:
第一行两个整数 n,s

第二行 n 个整数,每个整数表示一次课程报障数量ai

对于 10% 的数据,满足 1 ≤ n ≤ 2 * 10^3

对于 100% 的数据,满足 1 ≤ n ≤ 2 * 10^6,0 ≤ ai ≤ 10^2


输出描述:
最长连续的没有触发报警的课程数量
示例1

输入

3 2
1 1 3

输出

2

说明

前面两次课程分别为1,1 没有触发报警 所以答案是2
示例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)

发表于 2021-07-31 12:18:28 回复(0)
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);
        
    }
}

发表于 2020-08-29 10:48:17 回复(0)
n, s = map(int, input().strip().split())
a = list(map(int, input().strip().split()))

l, r = 0, 0
k, m = 0, 0
while r < n:
    m += a[r]
    if m > s:
        m -= a[l]
        l += 1
        r += 1
    else:
        k += 1
        r += 1
print(k)


发表于 2020-08-18 00:37:23 回复(0)
n, s = map(int, input().split(" "))
nums= list(map(int, input().split(" ")))
left = 0
right = 0
res = 0
windows = 0
while right < n:
    windows += nums[right]
    right += 1
    if windows <= s:
          res = max(res,right - left)
    else:
        while left < right and windows > s:
            windows -= nums[left]
            left += 1
print (res)
发表于 2020-08-01 11:06:00 回复(0)
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)

发表于 2020-07-31 23:36:25 回复(0)
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;
    }
}

发表于 2020-07-25 14:34:14 回复(0)
#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;
}

发表于 2020-03-27 16:39:12 回复(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)


发表于 2020-02-03 15:26:02 回复(0)
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;
    }
}

编辑于 2019-12-15 10:36:02 回复(0)