Subsequence poj3061 (二分)

http://poj.org/problem?id=3061

题意:找出一个连续子序列比m大,求最短符合题意的连续子序列的长度为多少?

 

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <stack>
#include <math.h>

using namespace std;

#define INF 0x3f3f3f3f
const int maxn = 110000;
typedef long long LL;
int a[maxn];
int n, m;

int Judge(int len)
{
    for(int i=1; i+len-1<=n; i++)
    {
        if(a[i+len-1]-a[i-1]>=m)
            return 1;
    }

    return 0;
}

int main()
{
    int T, num;

    scanf("%d", &T);

    while(T --)
    {
        scanf("%d %d", &n, &m);

        memset(a, 0, sizeof(a));

        for(int i=1; i<=n; i++)
        {
            scanf("%d", &num);
            a[i]=a[i-1]+num;
        }

       int l=1, r=n, mins=0;

       while(l<=r)
       {
           int mid=(l+r)/2;

           if(Judge(mid))
           {
               mins=mid;
               r=mid-1;
           }
           else
            l=mid+1;
       }

       printf("%d\n", mins);
    }
    return 0;
}

时间: 2024-10-25 08:24:09

Subsequence poj3061 (二分)的相关文章

[POJ3061]Subsequence(二分,前缀和)

题目链接:http://poj.org/problem?id=3061 题意:给一个长为n的数列和整数s,求一个连续的子序列,使得这个子序列长度最短并且不小于这个整数s. 统计[1~i]的子序列和sum(i),(sum(0)=0).然后求一个区间[i,j]的和即为sum(j)-sum(i-1) (i > 0). 由于给定序列没有负数,因此sum是个严格不减的序列. 转换成一个求最大值最小的问题,可以二分枚举序列长度,在前缀和上计算子序列[i-1,i+m-1]的和.如果存在一个满足子序列和≥s的,

POJ 3061 Subsequence (二分||尺取法)

A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, and a positive integer S (S < 100 000 000) are given. Write a program to find the minimal length of the subsequence of consecutive elements of the sequen

LA 2678 Subsequence(二分查找)

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=679 解题报告:给定一个正整数的序列,和一个S,求长度最短的子序列,使它们的和大于或等于S.序列长度n <= 100000 很明显,如果枚举起点和终点的话,时间复杂度是O(n^3),不行.怎么能在O(1)时间求出一个子序列的和是多少呢,可以用另一个数组sum[i

寒假 9(max subsequence sum二分递归算法实现并debug,表的链表实现概念过程整理)

二分递归实现过程收获: 一个取max的函数,核心是我brute的排序函数: 递归啊,如果结果出错,检查的时候查具体步骤,递归这个指令没什么好检查的: 遍布每个得出结果的关键点的输出测试: 因为一开始把right设成了array length,后面出现了str[length],有随机错误: 声明为int的小数,编译器直接不足近似处理为整数. 某处加一个break point,左边就可以看运行信息 表的链表实现概念梳理: 用链表实现的表,没有固定的位置编号,仅可以从value上识别,寻找,一个ele

POJ3061 Subsequence 尺取or二分

Description A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, and a positive integer S (S < 100 000 000) are given. Write a program to find the minimal length of the subsequence of consecutive elements o

POJ3061 Subsequence(二分前缀和法+尺取法)

二分+前缀和法 满足条件的子序列长度在(0,n)之间,sum[x+i]-sum[i]为从从第i个元素开始序列长度为x的元素的和.前缀和可在O(n)的时间内统计 sum[i]的值.再用二分找出满足条件的最小的子序列长度. #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<queue> #

POJ-3061 Subsequence 二分或尺取

题面 题意:给你一个长度为n(n<100000)的数组,让你找到一个最短的连续子序列,使得子序列的和>=m  (m<1e9) 题解: 1 显然我们我们可以二分答案,然后利用前缀和判断是否可行,这样是O(nlgn)的   注意没有答案 ans输出0 1 #include<cstdio> 2 #include<cstdlib> 3 #include<iostream> 4 #include<cstring> 5 using namespace

poj3061 Subsequence&amp;&amp;poj3320 Jessica&#39;s Reading Problem(尺取法)

这两道题都是用的尺取法.尺取法是<挑战程序设计竞赛>里讲的一种常用技巧. 就是O(n)的扫一遍数组,扫完了答案也就出来了,这过程中要求问题具有这样的性质:头指针向前走(s++)以后,尾指针(t)要么不动要么也往前走.满足这种特点的就可以考虑尺取法. poj3061 比较简单,也可以用二分做,时间复杂度O(n*logn).用尺取法可以O(n)解决. #include<iostream> #include<cstdio> #include<cstdlib> #i

POJ3061 Subsequence

题目大意:给定长度为n的整列整数a[0],a[1],--a[n-1],以及整数S,求出总和不小于S的连续子序列的长度的最小值. PS:用二分或者直尺法.省赛热身. #include <cstdio> #include <cstdlib> #include <vector> #include <algorithm> #include <cstring> using namespace std; const int INF = 0x3fffff; v