题意:
输入一个正整数N和M(N<=1e5,M<=1e8),接下来输入N个正整数(<=1e3),按照升序输出"i-j",i~j的和等于M或者是最小的大于M的数段。
AAAAAccepted code:
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int a[100007]; 5 int sum[100007]; 6 vector<pair<int,int> >ans; 7 int main(){ 8 ios::sync_with_stdio(false); 9 cin.tie(NULL); 10 cout.tie(NULL); 11 int n,m; 12 cin>>n>>m; 13 for(int i=1;i<=n;++i){ 14 cin>>a[i]; 15 sum[i]=sum[i-1]+a[i]; 16 } 17 int l=0,t=0,mn=1e9; 18 for(int i=0;i<=n;++i){ 19 t-=a[i]; 20 while(t<m&&l<=n) 21 t+=a[l++]; 22 if(t>=m&&t<mn){ 23 mn=t; 24 ans.clear(); 25 ans.push_back({i+1,l-1}); 26 } 27 else if(t==mn) 28 ans.push_back({i+1,l-1}); 29 } 30 cout<<ans[0].first<<"-"<<ans[0].second; 31 for(int i=1;i<ans.size();++i) 32 cout<<" "<<ans[i].first<<"-"<<ans[i].second; 33 return 0; 34 }