1044. Shopping in Mars

这个题表面好像是用部分和求任意区间val[ i~j ]内的数字和,但那样是O(n*n),用顺序扫描的方法是O(n)复杂度,还是很经典的问题

#include<vector>
#include<iostream>
using namespace std;
int val[100003],pay,n,mmin=1<<30, sum=0;
vector<pair<int,int>>posp;
int main(){
  scanf("%d%d",&n,&pay);
  for(int i=1;i<=n;i++) scanf("%d",val+i);  
  for(int i=1,j=1;i<=n;++i){
    while(j<=n&& sum<pay)sum+=val[j++];
    if(sum<pay)break;
    if(sum<mmin){posp.clear();mmin=sum;}
    if(sum==mmin)posp.emplace_back(i,j-1);
    sum-=val[i];
  }
  for(auto&x:posp)printf("%d-%d\n",x.first,x.second);
}


你可能感兴趣的:(1044. Shopping in Mars)