POJ 3061 Subsequence

01 Jul 2014

POJ 3061 Subsequence

ひきつづき蟻本をやっている。 しゃくとり法の問題らしい。 そもそもしゃくとり法ってなんなの?って思っていたら

http://d.hatena.ne.jp/komiyam/20120802/1343894601 に良い説明があった。

`「ある条件を満たす極小な区間を全て列挙するアルゴリズム」`

というのは非常にわかりやすい。

- 条件を満たさなければ右端を進めて区間を広げる。
- 条件を満たしていれば左端を進めて区間を狭める。

こちらもすごくしっくりくる。 今回の場合は、条件が「S以上になっているか」。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>

using namespace std;

int main() {
  int T;

  cin >> T;

  for (int i = 0; i < T; i++) {
    int N, S;
    scanf("%d %d", &N, &S);
    vector<int> sequence(N);
    for (int i = 0; i < N; i++) {
      scanf("%d", &sequence[i]);
    }


    int s = 0, t = 0, sum = 0;
    int length = N + 1;

    while (true) {
      while (sum < S && t < N) {
        sum += sequence[t++];
      }
      if (sum < S) {
        break;
      }
      length = min(length, t - s);
      sum -= sequence[s++];
    }
    if (length > N) {
      length = 0;
    }
    printf("%d\n", length);
  }

  return 0;
}

Tweet
comments powered by Disqus