poj 3061 尺取法

来源:互联网 发布:qq影音mac官方下载 编辑:程序博客网 时间:2024/05/17 05:12

链接:http://poj.org/problem?id=3061
尺取法学习:
将头一直往前去,知道满足条件为止,然后将尾巴往前移动一位。循环这个操作,直到不能再满足条件了。
思路:
记录头和尾的下标,再记录总和。
1)将头的下标一直往前移动,直到满足总和>=S,或者超出序列,如果满足总和>=S,更新连续的最短长度。否则结束操作
2)总和减掉末尾元素,同时将尾往前移动。
循环1) 2)操作,直到结束操作。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define M 100009#define INF 0x3f3f3f3fint a[M];int n,s;int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d %d",&n,&s);        for(int i = 0;i < n;i++)        {            scanf("%d",&a[i]);        }        int sum = 0;        int st = 0,en = 0;        int ans = INF;        for(;;)        {            while(en < n && sum < s)            {                sum += a[en++];            }            if(sum < s) break;            ans = min(ans,en-st);            sum -= a[st++];        }        if(ans != INF)        printf("%d\n",ans);        else printf("0\n");    }    return 0;}
0 0
原创粉丝点击