n,m
然后给出n个数
让你求所有存在的区间[l,r],使得a[l]~a[r]的和为m
并且按l的大小顺序输出对应区间。
如果不存在和为m的区间段,则输出a[l]~a[r]-m最小的区间段方案。
如果两层for循环l和r的话,会超时,实际上for循环一遍即可。
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h> #include <vector> #define INF 0x3f3f3f3f using namespace std; const int maxn=100000+5; int n,m; int diamond[maxn]; struct Ans{ int i,j; }; vector<Ans> ans; int main() { scanf("%d %d ",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&diamond[i]); int minlost=INF; Ans tmp; int sum=0; int start=1; for(int i=1;i<=n;i++){ sum+=diamond[i]; //printf("%d %d %d %d %d ",start,i,sum,sum-m,minlost); if(sum<m) continue; if(sum-m<=minlost){ if(sum-m<minlost){ ans.clear(); minlost=sum-m; } tmp.i=start; tmp.j=i; ans.push_back(tmp); } if(sum>=m && start<i){ sum-=diamond[i]; i--; sum-=diamond[start]; start++; } } for(int i=0;i<ans.size();i++){ printf("%d-%d ",ans[i].i,ans[i].j); } return 0; }