这道题木意思是给你一个连续的序列,要求找出其中连续和为给定值的一段序列,如果不存在这样的序列,那么就输出值大于给定值且最接近的这样值的一个序列。
题目数据量是10^5,如果用N*2复杂度肯定会超时,所以我采用的是On算法。但是在求和少于给定值的过程中所需的步骤不确定。总体效果还算不错,最大时间是39ms。
自己挖了一坑。。。
#include "stdafx.h" #include<iostream> #include<vector> using namespace std; struct Pair { int x; int y; Pair(int x,int y) { this->x=x; this->y=y; } }; vector<Pair> v; int main() { int n,m; int start=1; int data[100100]; int sum=0; freopen("1044.txt","r",stdin); int dis=0xffffffff>>1; while(scanf("%d%d",&n,&m)!=EOF) { bool flag=false; for(int i=1;i<=n;i++) { scanf("%d",&data[i]); sum+=data[i]; while(sum>m) { if(sum>m&&sum-m<dis) { dis=sum-m; v.clear(); v.push_back(Pair(start,i)); } else if(sum>m&&sum-m==dis) { v.push_back(Pair(start,i)); } sum-=data[start]; //先进行减法,然后再判断,导致两个数据不正确。 start=start+1; } if(sum==m) { printf("%d-%d ",start,i); sum-=data[start]; start=start+1; flag=true; } } if(!flag) { for(int i=0;i<v.size();i++) { printf("%d-%d ",v[i].x,v[i].y); } } } return 0; }