首页 > 代码库 > POJ-3061

POJ-3061

算法:

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