码迷,mamicode.com
首页 > 其他好文 > 详细

POJ-3061

时间:2016-10-06 12:55:11      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:

算法:

1. 定义两个整数N和S,输入序列长度到N,输入最小子序列和下界到S。

2. 定义一个数组arr[100002],从arr[1]开始依次输入N个序列元素到arr。

3. 定义一个整数ans,初始化ans=100002。

4. 执行下列尺取法步骤:
    1. 定义两个整数l和r,初始化l=1,r=2。

    2. 定义一个整数sum,初始化sum=arr[1]。

    3. 当不满足条件:r==N+1并且sum<S时,执行下列步骤,否则结束:
        1. 若sum<S,则令r=r+1,sum=sum+arr[r-1]。回到1.3。

        2. 若sum>=S,则令l=l+1,sum=sum-arr[l-1]。回到1.3。

4. 若ans==100002,说明没有符合条件的最小子序列,置ans=0,否则ans就是最小子序列长度。

5. 输出ans。

 

代码:

#include <iostream>

using namespace std;

int arr[100002];

int main()
{
    int time;
    cin >> time;
    while (time--)
    {
        int N, S;
        cin >> N >> S;
        for (int i = 1; i <= N; ++i)
        {
            cin >> arr[i];
        }
        int ans = 100002;
        { // Algorithm: Ruler Method
            int l = 1, r = 2;
            int sum = arr[1];
            while (!(r == N + 1 && sum < S))
            {
                if (sum < S)
                {
                    ++r;
                    sum += arr[r - 1];
                }
                else
                {
                    ans = ans>r - l ? r - l : ans;
                    ++l;
                    sum -= arr[l - 1];
                }
            }
            if (ans == 100002)
            {
                cout << 0 << endl;
            }
            else
            {
                cout << ans << endl;
            }
        }
    }
    return 0;
}

 

POJ-3061

标签:

原文地址:http://www.cnblogs.com/yuqingshan/p/5933667.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!