//
// main.cpp
// PAT_1044. Shopping in Mars
//
// Created by wjq on 17/5/9.
// Copyright © 2017年 wjq. All rights reserved.
//
#include <iostream>
#include <vector>
using namespace std;
int N,M,A[100000005],hasEqual=0;
vector<pair<int,int> >v;
vector<pair<int,int> >ms;
int main(int argc, const char * argv[])
{
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++)
scanf("%d",&A[i]);
long long int sum,minsum=999999;
for(int i=1;i<=N;i++)
{
sum=0;
for(int j=i;j<=N;j++)
{
sum+=A[j];
if(sum==M)
{
hasEqual=1;
v.push_back(make_pair(i, j));
break;
}
else if(hasEqual==0&&sum>M)
{
if(sum<minsum)
{
ms.clear();
minsum=sum;
ms.push_back(make_pair(i, j));
}
else if(sum==minsum)
ms.push_back(make_pair(i, j));
break;
}
}
}
if(hasEqual==1)
for(int i=0;i<v.size();i++)
printf("%d-%d\n",v[i].first,v[i].second);
else
for(int i=0;i<ms.size();i++)
printf("%d-%d\n",ms[i].first,ms[i].second);
return 0;
}
第三个和第六个case超时了,重新写一个.应该是要动态规划了.
//
// main.cpp
// PAT_1044. Shopping in Mars
//
// Created by wjq on 17/5/9.
// Copyright © 2017年 wjq. All rights reserved.
//
#include <iostream>
#include <vector>
using namespace std;
int N,M,A[100000005],hasEqual=0;
vector<pair<int,int> >v;
vector<pair<int,int> >ms;
int main(int argc, const char * argv[])
{
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++)
scanf("%d",&A[i]);
long long int sum=A[1],minsum=999999;
int start=1,end=1;
while(start!=N+1&&end!=N+1)
{
if(sum<M)
{
end++;
sum+=A[end];
}
else if(sum==M)
{
hasEqual=1;
v.push_back(make_pair(start, end));
sum-=A[start];
start++;
}
else if(sum>M)
{
if(sum<minsum&&hasEqual==0)
{
ms.clear();
ms.push_back(make_pair(start, end));
minsum=sum;
}
else if(sum==minsum&&hasEqual==0)
ms.push_back(make_pair(start, end));
sum-=A[start];
start++;
}
}
if(hasEqual==1)
for(int i=0;i<v.size();i++)
printf("%d-%d\n",v[i].first,v[i].second);
else
for(int i=0;i<ms.size();i++)
printf("%d-%d\n",ms[i].first,ms[i].second);
return 0;
}
写的太慢了!
这种序列的求和过程.是一个对和分类讨论然后处理起始指针和结束指针的思路.