【PAT甲级】1044 Shopping in Mars (25 分)(前缀和,双指针)

题意:

输入一个正整数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 }
保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
原文地址:https://www.cnblogs.com/ldudxy/p/11605695.html