两个循环肯定会超时,当求出一个片段和大于或者等于M时,我们对其处理完之后,
我们把这个片段和减去第一个元素,再观察片段和,小于M就加入一个元素。这样效率就会好很多。
这个也得用scanf和printf才能AC。
代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int a[100001];
vector<int > over;
int main()
{
int N,M;
// cin >> N >> M;
scanf("%d %d",&N,&M);
int i;
for(i = 0;i<N;i++)
scanf("%d",&a[i]);
int min = 10000000;
bool flag = false;
i = 0;
int j = 0;
int sum = a[0];
while(j < N)
{
if(sum < M){
j++;
if(j == N)
break;
sum += a[j];
}
else if(sum == M)
{
flag = true;
printf("%d-%d\n",(i+1),(j+1));
// cout << i+1 << "-" << j+1 << endl;
sum -= a[i];
i++;
}
else
{
if(flag)
{
sum -= a[i];
i++;
}
}
if(!flag && sum > M)
{
if(sum < min)
{
over.clear();
over.push_back(i);
over.push_back(j);
min = sum;
sum -= a[i];
i++;
}
else if(sum == min)
{
over.push_back(i);
over.push_back(j);
sum -= a[i];
i++;
}
else
{
sum -= a[i];
i++;
}
}
}
if(!flag)
{
i = 0;
while(i < over.size())
{
printf("%d-%d\n",(over[i]+1),(over[i+1]+1));
// cout << over[i]+1 <<"-" <<over[i+1]+1 << endl;
i = i + 2;
}
}
return 0;
}