POJ 3061 Subsequence【尺取法】

来源:互联网 发布:淘宝保健品好做吗 编辑:程序博客网 时间:2024/05/05 01:28

尺取法见 挑战程序设计竞赛P148(电子版大概P158),这里直接上图。




两个指针,右指针尽量右靠找到符合条件的最右点,判断是否更新答案,然后左指针移动一格,减小区间,继续下次循环找最右(如果不移动指针也还符合条件那说明答案更佳了),然后不断重复之

#include <cstdio>#include <cmath>#include <iostream>#include <algorithm>using namespace std;#define ll long longint val[100005];int main() {    int te, n, aim;    cin >> te;    while (te--) {        cin >> n >> aim;        for (int i = 0; i < n; ++i) {            cin >> val[i];        }        int sum = 0, s = 0, t = 0, ans = n + 1;        while (true) {            while (t < n && sum < aim) {                sum += val[t++];            }            if (sum < aim) break;            ans = min(ans, t - s);            sum -= val[s++];        }        if (ans == n + 1)   //区分找不到的情况,不能是n            ans = 0;        cout << ans << endl;    }    return 0;}



0 0