有一点超时,感觉这是dp
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;
map<int,int> ans;
int d[100010],h[100010];
int main(){
freopen("in.txt","r",stdin);
int n,m,start=-1,mind=123123123;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&d[i]);
if(i==0){
h[0]=d[0];
}else{
h[i]=h[i-1]+d[i];
}
if(h[i]>=m && start==-1){
start=i;
}
if(mind>d[i]){
mind=d[i];
}
}
//m小于任何一个数字
if(mind>m){
m=mind;
}
//对于找不到m,则找出最小和
int minh=123123123;
for(int i=start;i<n;i++){
if(h[i]==m){
ans[1]=i+1;
}else{
for(int j=0;j<i;j++){
if(h[i]-h[j]==m){
ans[j+2]=i+1;
}else if(h[i]-h[j]<m){
break;
}else{
if(h[i]-h[j]<minh){
minh=h[i]-h[j];
}
}
}
}
}
if(ans.size()==0){
/*int ss=h[start]-m;
for(int i=0;i<start;i++){
if(h[i]>=ss ){
if(i!=0){
ss=h[i-1];
}else{
ss=0;
}
break;
}
}
int minh=h[start]-ss;*/
for(int i=start;i<n;i++){
if(h[i]==minh){
ans[1]=i+1;
}else{
for(int j=0;j<i;j++){
if(h[i]-h[j]==minh){
ans[j+2]=i+1;
}else if(h[i]-h[j]<minh){
break;
}
}
}
}
}
for(map <int,int>::iterator it=ans.begin();it!=ans.end();it++){
printf("%d-%d\n",it->first,it->second);
}
return 0;
}