LA2678 Subsequence 时间优化

来源:互联网 发布:缺血半暗带的算法 编辑:程序博客网 时间:2024/05/16 10:44

刚刚写完替罪羊树,就给你们写这道easy题了(你不会又不知道什么是替罪羊树吧,网址你们慢慢看,我都写了多少次这个网址了?http://blog.csdn.net/ljf_cnyali/article/details/52588737)
闲话短说,这道题目博主没什么说的,大家可以明白这是递推关系的,重要的剪枝就只有:

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;}
0 0