坑点:
①If it is impossible to pay the exact amount, you must suggest solutions with minimum lost.
当无法找到满足sum=M的数据时,要输出满足sum>M的最小sum(如果有多组最小sum,则它们对应的left/right都要输出)
②给一组特殊数据
1 10
18
output:1-1
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn=100010;
const int maxc=100000010;
int value[maxn]={0};
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&value[i]);
}
int left=1,right=1,sum=value[1];
int flag=0,minleft[maxn],minright[maxn],mincost=maxc;
//if flag=1 means exactly;if flag=1,print min_left and min_right
while(right<=n){
while(sum<m&&right<=n){ //find first right of sum>=m
right++;
sum+=value[right];
}
if(sum==m){
printf("%d-%d\n",left,right);
flag=-1;
if(right==n){
break;
}else{
right++;
sum+=value[right];
}
}else if(sum>m&&flag>=0){
if(mincost>sum){
flag=0;
mincost=sum;
minleft[flag]=left;
minright[flag]=right;
}else if(mincost==sum){
flag++;
minleft[flag]=left;
minright[flag]=right;
}
}
sum-=value[left];
left++;
}
for(int k=0;k<=flag;k++){
printf("%d-%d\n",minleft[k],minright[k]);
}
return 0;
}