题意 : 找出给定序列长度最小的子序列,子序列的和要求满足大于或者等于 S,如果存在则输出最小长度、否则输出 0(序列的元素都是大于 0 小于10000)

分析 : 有关子序列和的问题,都可以考虑采用先构造前缀和的方式来进行接下来的操作 ( 任意子序列的和都能由某两个前缀和的差表示 )。

二分做法 ==> 我们枚举起点,对于每一个起点 St 二分查找看看 St 后面有没有前缀和是大于或者等于 [ St的前缀和 ] + S 的,如果有说明从当前起点开始有一个终点使得起终之和是大于或者等于 S 的,在这个过程中维护最小长度即可!时间复杂度为 O(nlogn)

#include<bits/stdc++.h>
using namespace std;
;

int arr[maxn], sum[maxn];
int main(void)
{
    int nCase;
    scanf("%d", &nCase);
    sum[] = ;
    while(nCase--){
        int n, s;
        scanf("%d %d", &n, &s);

        ; i<=n; i++){
            scanf("%d", &arr[i]);
            sum[i] = sum[i-] + arr[i];
        }

        if(sum[n] < s){
            puts(");
            continue;
        }

        int ans = n;
        ; i<=n; i++){
            ;
            int en = lower_bound(sum+st, sum+n, sum[st]+s) - sum;
            //printf("%d %d\n", st, en);
            if(sum[en] - sum[st] < s) continue;
            ans = min(ans, en - st);
        }

        printf("%d\n", ans);
    }
    ;
}

尺取做法 ==> 如果有一个满足条件的子序列为 arr[st]...arr[en-1] >= S,那么肯定有 arr[st+1]...arr[en-2] < arr[st]...arr[en-2] < S,所以如果将 st+1 作为起点也有满足条件的序列且令其终点为en'-1,那么必定有 en'-1 >= en-1,那么也就是说当前枚举完 st 这个点,其贡献的答案是 (en-1)-st+1,现在我们考虑 st+1 即下一个起点的时候考虑的终点应该是要考虑大于或者等于 en-1 的点,故尺取是正确的解法。时间复杂度为O(n)

///尺取法
#include<bits/stdc++.h>
using namespace std;
;

int sum[maxn];
int main(void)
{
    sum[] = ;

    int nCase;
    scanf("%d", &nCase);
    while(nCase--){
        int n, s;
        scanf("%d %d", &n, &s);

        int tmp;
        ; i<=n; i++)
            scanf("%d", &tmp),
            sum[i] = sum[i-] + tmp;///统计前缀和

        if(sum[n] < s){
            puts(");
            continue;
        }

        int L, R, ans;///左指针、右指针
        ans = n;
        L = R = ;

        while(L <= R && R <= n){
            if(sum[R] - sum[L] < s) R++;
            else{
                ans = min(ans, R-L);
                L++;
            }
        }

        printf("%d\n", ans);
    }
    ;
}

POJ 3061 Subsequence ( 二分 || 尺取法 )的更多相关文章

  1. POJ 3061 Subsequence ( 尺取法)

    题目链接 Description A sequence of N positive integers (10 < N < 100 000), each of them less than ...

  2. POJ 3061 Subsequence(尺取法)

    题目链接: 传送门 Subsequence Time Limit: 1000MS     Memory Limit: 65536K 题目描述 给定长度为n的数列整数以及整数S.求出总和不小于S的连续子 ...

  3. POJ 3061 Subsequence 二分或者尺取法

    http://poj.org/problem?id=3061 题目大意: 给定长度为n的整列整数a[0],a[1],--a[n-1],以及整数S,求出总和不小于S的连续子序列的长度的最小值. 思路: ...

  4. poj 3061 Subsequence 二分 前缀和 双指针

    地址 http://poj.org/problem?id=3061 解法1 使用双指针 由于序列是连续正数 使用l r 表示选择的子序列的起始 每当和小于要求的时候 我们向右侧扩展 增大序列和 每当和 ...

  5. Poj 3061 Subsequence(二分+前缀和)

    Subsequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12333 Accepted: 5178 Descript ...

  6. POJ 3061 Subsequence 二分查找

    题目大意:给出长度为n的一个序列,给出一个数字S,求长度最短的序列和大于等于S的连续子序列,输出该长度,如果没有答案输出0. 题目思路:看数据范围,这道题就是卡时间的.我们可以用sum[i]记录前i项 ...

  7. 题解报告:poj 3061 Subsequence(前缀+二分or尺取法)

    Description A sequence of N positive integers (10 < N < 100 000), each of them less than or eq ...

  8. POJ 3061 Subsequence【二分答案】||【尺取法】

    <题目链接> 题目大意: 给你一段长度为n的整数序列,并且给出一个整数S,问你这段序列中区间之和大于等于S的最短区间长度是多少. 解题分析:本题可以用二分答案做,先求出前缀和,然后枚举区间 ...

  9. POJ 3061 Subsequence 尺取法 POJ 3320 Jessica's Reading Problem map+set+尺取法

    Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13955   Accepted: 5896 Desc ...

随机推荐

  1. 【MM系列】SAP 根据采购订单创建外向交货单的BAPI

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP 根据采购订单创建外向交货单的 ...

  2. PHP Memcache 扩展安装

    PHP Memcache 扩展安装 PHP Memcache 扩展包下载地址:http://pecl.php.net/package/memcache,你可以下载最新稳定包(stable). 下载对应 ...

  3. 利用yum创建本地仓库与网络源

    一.创建本地yum仓库 1.cd /etc/yum.repos.d/ 2.创建配置文件:[root@li yum.repos.d]# vim local.repo 3.写入配置信息并保存 [li]na ...

  4. 应用安全 - 中间件 - Apache - Apache POI

    CVE-2014-3529 Date2014 类型 注入XML外部实体访问外部实体资源或者读取任意文件 影响范围 Apache POI 3.10-FINAL及以前版本 复现 CVE-2016-5000 ...

  5. xmake新增对WDK驱动编译环境支持

    xmake v2.2.1新版本现已支持WDK驱动编译环境,我们可以直接在系统原生cmd终端下,执行xmake进行驱动编译,甚至配合vscode, sublime text, IDEA等编辑器+xmak ...

  6. P3958奶酪

    这个题是2017noip提高组的真题,是一个深度搜索题,得分轨迹:10-80-100pts. 在三维空间里,存在可能连通的洞(半径r),问是否可以通过这些洞从底部到达顶部.一开始我联想到了01迷宫,以 ...

  7. [BZOJ3133] [Baltic2013]ballmachine(树上倍增+堆)

    [BZOJ3133] [Baltic2013]ballmachine(树上倍增+堆) 题面 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树滚下.如果 ...

  8. 有序无序ul->li ol->li菜单,默认点击当前弹出下拉,再次点击收起下拉菜单

    实现这一效果利用css和js技术结合 以ul->li为例子 <!DOCTYPE html><html lang="en"><head> & ...

  9. MySQL: InnoDB的并发控制,锁,事务模型

    一.并发控制 为啥要进行并发控制? 并发的任务对同一个临界资源进行操作,如果不采取措施,可能导致不一致,故必须进行并发控制(Concurrency Control). 技术上,通常如何进行并发控制? ...

  10. 利用CSS的translate属性或利用CSS实现图片居中的效果

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...