辅导课堂在推进质量建设,需要分析每堂直播课的用户报障数量。
当连续多个课程的报障数量之和大于一个数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
输出例子1:
2
例子说明1:
前面两次课程分别为1,1 没有触发报警 所以答案是2
输入例子2:
6 5
5 1 1 1 2 3
输出例子2:
4
例子说明2:
中间的课程打分 1 1 1 2之和等于5 没有触发报警
tips: 使用两个Index,只需要O(n)的复杂度。
#include<iostream>
#include<vector>
#include<stack>
#include<algorithm>
#include<queue>
using namespace std;
int main() {
int n,s;
cin>>n>>s;
vector<int> classes;
int maxNum=0;
for (int i = 0; i < n; i++)
{
int temp;
cin>>temp;
classes.push_back(temp);
}
int index1=0,index2=0;
int sum=0;
for (int index2 = 0; index2 < n; index2++)
{
if(classes[index2]>s) {
continue;
index1=index2+1;
} else if(index1==index2&&classes[index1]<=s) {
maxNum=1;
sum=classes[index1];
} else {
sum+=classes[index2];
while(sum>s&&index1<index2) {
sum-=classes[index1];
index1++;
}
}
if(index2-index1+1>maxNum) {
maxNum=index2-index1+1;
}
}
cout<<maxNum<<endl;
// system("pause");
return 0;
}