代码与思路
#include <cstdio>
using namespace std;
#define INF 0x7fffffff
int main(){
int num, cost, diamonds[100010];
scanf("%d%d", &num, &cost);
for(int i = 0; i < num; i++)
scanf("%d", &diamonds[i]);
//left,right用来标记要输出的左右边界
//right=-1是为了操作的统一
//sum用来求left到right的数的和
//min用来记录目前大于cost的最小sum
int left = 0, right = -1, sum = 0, min = INF;
//第一遍循环确认min
while(true){
if(sum == cost){
min = cost;
break;
}
else if(sum < cost){
if(right + 1 < num)
sum += diamonds[++right];
else
break;
}
else{
min = sum < min ? sum : min;
sum -= diamonds[left++];
}
}
left = 0;right = -1;sum = 0;
//第二遍循环输出所有满足条件的left和right
while(true){
if(sum == min){
printf("%d-%d\n", left + 1, right + 1);
sum -= diamonds[left++];
}
else if(sum < min){
if(right + 1 < num)
sum += diamonds[++right];
else
break;
}
else
sum -= diamonds[left++];
}
return 0;
}