POJ-3061.Subsequence(尺取法)

小灰灰 2022-03-01 17:18 289阅读 0赞

3061.Subsequence

描述

给出N个正整数(10 <N <100 000)的序列,每个正整数小于或等于10000,并且给出正整数S(S <100 000 000)。编写程序以找到序列的连续元素的子序列的最小长度,其总和大于或等于S.

输入

第一行是测试用例的数量。对于每个测试用例,程序必须从第一行读取数字N和S,以间隔分隔。序列的编号在测试用例的第二行中给出,以间隔分开。输入将以文件结尾结束。

输出

对于每种情况,程序必须在输出文件的单独行上打印结果。如果没有答案,则打印0。

Sample Input

  1. 2
  2. 10 15
  3. 5 1 3 5 10 7 4 9 2 8
  4. 5 11
  5. 1 2 3 4 5

Sample Output

  1. 2
  2. 3

尺取法

设sum是当前连续子序列的和,i,j分别是当前连续子序列的始和末,当sum=s,判断并取序列长度的最小,当循环完一轮后,sum仍然小于s,就终止循环。

  1. #include <iostream>
  2. using namespace std;
  3. const int M = 100005;
  4. int nums[M];
  5. int n, s;
  6. int main()
  7. {
  8. int t;
  9. cin >> t;
  10. while (t--)
  11. {
  12. cin >> n >> s;
  13. for (int i = 0; i < n; i++)
  14. {
  15. cin >> nums[i];
  16. }
  17. int res = n + 1, sum = 0;
  18. int i = 0, j = 0;
  19. while (true)
  20. {
  21. while (j<n && sum < s )
  22. {
  23. sum += nums[j];
  24. j++;
  25. }
  26. if (sum < s) //当满足条件时,此时的j是等于n的,已经不存在大于s的子序列了
  27. break;
  28. res = min(res, j - i);
  29. sum -= nums[i++];
  30. }
  31. if (res > n)
  32. res = 0;
  33. cout << res << endl;
  34. }
  35. return 0;
  36. }

发表评论

表情:
评论列表 (有 0 条评论,289人围观)

还没有评论,来说两句吧...

相关阅读

    相关 算法--

    尺取法 尺取法通常是指对数组保存一对下标(起点,终点),然后根据实际情况交替推进两个端点直到得出答案的方法,这种操作很像是尺取虫爬行的方式故得名。 我们先来看看POJ的