您的位置:首页 > 产品设计 > UI/UE

LA2678 Subsequence 时间优化

2016-08-26 19:52 316 查看
这道题目博主不想多说什么了,大家可以明白这是递推关系的,重要的剪枝就只有

if(sum[i - 1] > sum[j] - m)
continue;


其他的都应该可以看懂吧,博主找了很久的错误,后来才发现是

            if(sum[i - 1] > sum[j] - m)
continue;
while(sum[i] <= sum[j] - m)
++i;


的while循环里面的sum[i]打成了sum[i - 1],不要像博主一样犯低级错误哦!

废话不多说,直接上代码。

/*************************************************************************
> File Name: LA\LA_2678.cpp
> Author: ljf_cnyali
> Mail: 2724424647@qq.com
> Last modifiedz: 2016-08-26 19:36
> Description: This is a large group of God's program information.
************************************************************************/

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<ctime>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<ctime>

using namespace std;

#define REP(i, a, b) for(int i = (a), _end_ = (b);i <= _end_; ++i)

const int maxn = 101000;

int sum[maxn];

int main() {
int n, m;
while(scanf("%d%d", &n, &m) != EOF) {
int k;
memset(sum, 0, sizeof(sum));
REP(i, 1, n) {
scanf("%d", &k);
sum[i] = sum[i - 1] + k;
}
int ans = n + 1;
int i = 1;
REP(j, 1, n) {
if(sum[i - 1] > sum[j] - m) continue;
while(sum[i] <= sum[j] - m)
++i;
ans = min(ans, j - i + 1);
}
printf("%d\n", ans == n + 1 ? 0 : ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LA cpp入门