标签:
算法:
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; }
标签:
原文地址:http://www.cnblogs.com/yuqingshan/p/5933667.html