POJ 3061 Subsequence(二分/尺取法)

#尺取法# 尺取法总结和经典例题 题目链接:POJ3061题目链接:codeforces 660 C题目链接:UVA11572POJ3061Description 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 00 阅读详情

题目链接:

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

解题思路:

题目大意:

给定长度为n的整列整数a[0],a[1],……a[n-1],以及整数S,求出总和不小于S的连续子序列的长度的最小值。

由于所有的元素都大于零,如果子序列[s,t)满足a[s]+...+a[t-1]>=S,那么对于任何t <t'一定有a[s]+...a[t'-1]>=S。此外对于区间[s,t)上的总和来说如果令s

um[i]=a[0]+a[1]+...+a[i-1]那么a[s]+a[s-1]+...a[t-1]=sum[t]-sum[s],因此预先以O(n)的时间计算好sum的话,就可以以O(1)的时

间计算区间上的总和。这样一来,子序列的

起点s确定以后,便可以用二分搜索快速地确定使序列和不小于S的结尾t的最小值。

AC代码(二分法):

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 100005;
int n,s;
int a[maxn];
int sum[maxn+1];

void solve(){
    //计算sum
    for(int i = 0; i < n; i++)
        sum[i+1] = sum[i]+a[i];
    if(sum[n] < s){
        printf("0\n");
        return ;
    }
    int res = n;
    for(int i = 0; sum[i] + s <= sum[n];i++){
        //利用二分搜索求出t
        int t = lower_bound(sum+i,sum+n,sum[i]+s)-sum;
        res = min(res,t-i);
    }
    printf("%d\n",res);
}

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]);
        solve();
    }
    return 0;
}

这个时间复杂度是O(nlogn),虽然足以解决这个问题,但我们还可以更高效地解决。我们设以a[s]开始的总和最初大于S时的连续子序列为a[s]+a[s+1]+……a[t-1],这时,

a[s+1]+a[s+1]+……a[t-2]<a[s]+a[s+1]+……a[t-2]<S,所以如果从a[s+1]开始总和最初超过S的连续子序列是a[s+1]+……a[t‘-1],则t<=t'。

故可以设计如下算法:

(1)初始s=t=sum=0

(2)只要依然有sum<S,就不断将sum加上a[t],并且t=t+1;

(3)如果(2)中无法满足sum>=s则终止,否则ans=min(ans,t-s);

(4)将sum减去a[s],s增加1然后回到(2).

对于这个算法,因此t最多变化n次,因此只需O(n)的复杂度就可以求解这个问题了。


5 1 3 5 10 7 4 9 2 8
        ↓
5 1 3 5 10 7 4 9 2 8
        ↓
5 1 3 5 10 7 4 9 2 8
        ↓
5 1 3 5 10 7 4 9 2 8
        ↓
5 1 3 5 10 7 4 9 2 8
        ↓
5 1 3 5 10 7 4 9 2 8
        ↓
5 1 3 5 10 7 4 9 2 8
        ↓
5 1 3 5 10 7 4 9 2 8

AC代码(尺取法):

#include <iostream>
#include <cstdio>
using namespace std;

int n,S;
int a[100005];

void solve(){
    int res = n+1;
    int s = 0,t = 0,sum = 0;
    while(1){
        while(t < n && sum < S){
            sum += a[t++];
        }
        if(sum < S)
            break;
        res = min(res,t-s);
        sum -= a[s++];
    }
    if(res > n){
        //解不存在
        res = 0;
    }
    printf("%d\n",res);
}

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]);
        solve();
    }
    return 0;
}


POJ——3061题 Subsequence 尺取法 Time Limit:1000MS Memory Limit:65536K Total Submissions:24814 Accepted:10475 Description A sequence of N positive integers (10 < N < 100 000), each of them less than or ... 阅读详情

相关推荐

绕开华为通道,获取解锁码解锁BootLoader

刷机有风险,操作需谨慎,如果因为各种因素导致手机变砖无法开机,本教程概不负责,望悉知 前言 这篇文章的大多内容是根据我自己找的一篇文章《绕开华为通道,获取解锁码解锁BootLoader》来编写的,里面的大部分内容是文章的原内容。下面的都是我参考文章中做了一些小部分的修改,增加了我华为P8手机的一些操作,下面开始讲述我的解锁过程。 因为华为官方在2018年的七八月份吧,关闭了解锁码的申请通道,这...

Martin.Mu `s Special Column 5万+

POJ 3061(尺取法入门)

weixin_30657541的博客 492

C#与Lua交互原理

以前每一次研究一些新知识并且有所收获的时候,都想写一篇博客来分享这种自己的收获。 一直没有写主要是因为自己水平太菜了,怕写出来贻笑大方,最近想通了,想写就写下来,就算对别人毫无用处,还可以自己没事翻翻,省得自己都忘了。当然如果能对你有一丝丝的帮助,那真是再好不过了 。本文将针对C#与Lua的调用原理阐述一些个人的心得 。 Lua开发环境搭建 有关于VS &amp...

Hui Ye的博客 1万+

poj3061:Subsequence(最短子序列和) -- 前缀和与二分

题面: 题目链接: http://poj.org/problem?id=3061 题目大意: 给出了一个N个正整数(10 <N <100 000)的序列,每个正整数小于或等于10000,并给出了一个正整数S(S <100 000 000)。编写程序以查找序列中连续元素的子序列的最小长度,其总和大于或等于S。 题目分析: 求连续元素的子序列,可以知道我们最后得到的序列是原序列中的一个区间,要想求出序列中某个子序列的和,我们可以采用前缀和的知识,例如 l ~ r 的区间.

潘小蓝的博客 1696

继电器的选型规范

触点是继电器中最重要的结构件,触点的使用寿命受触点材料、触点上的电压及电流值(特别是接通时及断开时的电压、电流波形)、负载种类、切换频率、环境情况、接触形式、触点回跳现象等的影响,触点失效多以触点的材料转移、粘连、异常消耗、接触电阻增大等故障现象出现,使用时需要注意。为了稳定工作, DC 型继电器的线圈两端所加电压推荐使用波纹变化率小于±5%的线圈额定电压,否则继电器会工作不稳定,引起触点的粘接或异常损耗,特别是在继电器的驱动电路上连接有电动机、螺线管、变压器等器件时,这种情况更为明显。

qq_43416206的博客 1879

计算机视觉(相机标定;内参;外参;畸变系数)

目录 一、预备知识 1、坐标系变换过程(相机成像过程) (1)相机坐标系转换为图像坐标系(透视投影变换遵循的是针孔成像原理) (2)齐次坐标的引入原因:(为什么引入齐次坐标???) 2、内参与外参矩阵的构成 3、畸变参数 二、相机标定 1、张正友标定法(光学标定)及其求解思路 2、求解内参矩阵与外参矩阵的思路: (1)计算内参与外参矩阵的乘积M (2)求解内参矩阵A (3)求解外参矩阵(R1 R2 T) 三、参数优化 1、L-M算法 2、相机标定步骤 四、相关代码及其实验结.

QYJ_WORKHARDING的博客 6万+

POJ3061 Subsequence

POJ3061 Subsequence 这道题是POJ上id为3061的一道题,这道题总体来说比较简单,但是坑点也不少额,稍微不注意就WA了,好了,我们一起来看看题意吧: 我们先看下中文大致题意吧: 给定长度为n的正整数数列以及正整数S,求出总和不小于S的连续子串的长度的最小值,如果解不存在,则输出 0 下面的描述是来自POJ官网 题目描述 A sequence of N positive integers (10 < N < 100 000), each of them less th

小知识吖 2886

【论文精读】Graph WaveNet-深度时空图模型

Graph WaveNet构建了一个自适应邻接矩阵,它能保留隐藏的空间依赖关系,能够自动从数据中发现未见的图结构。提出了一个有效且高效的框架,可同时捕捉空间和时间依赖关系。其核心思想是将其提出的图卷积与扩张因果卷积相结合,使每个图卷积层都能处理空间依赖关系。在交通数据集上评估了提出的模型,并以较低的计算成本获得了最先进的结果。

打酱油的葫芦娃 1007

POJ-3061【尺取算法】

目录题意解题思路代码 参考思路:传送门 题意 链接:POJ-3061 给长度为n的数组和一个整数m,求总和不小于m的连续子序列的最小长度 解题思路 过程大致分为四步: 初始化左右端点,即先找到一个满足条件的序列。 在满足条件的基础上不断扩大右端点。 如果第二步无法满足条件则终止,否则更新结果。 扩大左端点,并且回到第二步。 举个例子: n = 10,m = 15 5 1 3 5 10 7 4 9 2 8 则ans=2 代码 #include<stdio.h> #include&l

zjllll123的博客 1135

Yocto系列讲解[入门篇] 2 - 演示运行qemux86-64虚拟机

手把手教大家怎么编译Yocto,并运行一个qemux86虚拟机

fulinux的博客 1万+

Unity与iOS原生交互实战指南

C#(DllImport) → C 接口(extern "C") → Objective‑C / SwiftObjective‑C → UnitySendMessage → C#(GameObject + public 方法)在写.mm文件;在里面写;C# 用声明;调用它,参数就是 string / 数值等;在.mm里做你想做的 iOS 原生操作。在 Unity 里准备一个常驻 GameObject,比如;上面挂一个脚本,写;在 iOS 插件中用;

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1357

POJ3061(尺取法例题)

解法一、二分+前缀和 #include <iostream> #include <algorithm> #include <cstring> typedef long long ll; using namespace std; const int N = 100000+10; ll a[N]; ll sum[N]; int main() { int t; cin>>t; while(t--){ memset(sum,0,

weixin_45724872的博客 441

镜头像差之五——场曲

什么是场曲? 场曲[curvature of field] 物面上所有的点经过系统后,最佳焦点位置不在同一平面上,若这些像点所成的面为曲面,则称为系统有场曲。 与物高二次方、入射光瞳口径一次方成正比的像差。若仅存在场曲,则所有物平面上的点都有相应的像点,但分布在一个球面上;若采用弯成此种形状的底片,则可获得处处清晰的像。此时在理想像平面上,像点呈现为圆斑。 第一张图是最简单也是最容易理解的场曲,也就是对焦点锐利,其余部分逐渐松散,但实际上大多现代镜头的场曲都呈现为图二的形态:对焦点与边缘锐度.

camerall 1万+

尺取法(POJ3061 Subsequence)

尺取法 大佬的总结 luogu尺取法例题+解析 csdn尺取法例题+解析 1. POJ3061 题意: 给定一个序列,找出最短的连续子序列长度,使得其和大于等于SSS。 Code: #include <iostream> using namespace std; typedef long long ll; const int maxn = 1e5 + 5; const int IN...

NaNa 171

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

程序设计竞赛常用技巧—— 尺取法 讲解

什么是尺取法? 保存一对下标,根据实际情况交替推进两个端点的方法,就是尺取法!

2bit 1059

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

POJ 3061—Subsequence(尺取法)

链接:http://poj.org/problem?id=3061 题目 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 o

Mr.RainsdRop的胡思乱想 919

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

尺取法(取尺法)及模板题 poj-3061 Subsequence

什么是尺取法(取尺法) 其实我也不太懂到底是尺取法还是取尺法,好像都可以= =下文统一尺取法。其实很多人写的双指针就就是尺取法,只是突然换个名字,大概的思路以及应用都是类似的,双指针是2个指针移动,尺取法就是设定尺子的两端位置,然后移动。 简单的例子 假设给出一串01组成的字符串,要求找出连续的0或者连续的1的最长长度,比较简单的写法就是双指针,定义两个指针,...

iwts 1170

POJ 3061 Subsequence 尺取法

http://poj.org/problem?id=3061 Subsequence Time Limit:1000MS Memory Limit:65536K Total Submissions:28853 Accepted:12121 Description A sequence of N positive integers (10 &lt...

yanyanwenmeng的博客 323

poj 3061 Subsequence 尺取法

题目描述 给定长度为n的数列整数a0,a1,a2…an-1以及整数S。求出总和不小于S的连续子序列的长度的最小值,如果解不存在输出0 解题思路: 取尺法: 取尺法通常是指对数组保存一对下标(起点和重点),然后根据实际情况交替推进两个端点直到得到答案的方法。 对应于这道题目来讲,由于每个元素都大于零,如果子序列[s,t)满足as+as+1+…+at-1>=S,那么对应于任何的t’>t。一...

逐梦er的博客 2180

POJ 3061 Subsequence(尺取法)

Subsequence Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Description A sequence of N positive integers (10 < N < 100 000), each of them less

K键盘里的青春K 712

POJ3061---Subsequence(尺取法)

Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9998   Accepted: 4052 尺取法,像尺子一样;一段一段的找; 题意:找最小区间和大于等于给定的数; Description A sequence of N

梦载代码 484

poj3061 Subsequence 前缀和二分+尺取法

http://poj.org/problem?id=3061 前缀和二分 复杂度O(nlogn) #include &lt;iostream&gt; #include &lt;algorithm&gt; #include &lt;cstring&gt; using namespace std; const int maxn=100005; int n,s,a[maxn],sum[maxn+1...

skykone1的博客 265

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

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 o...

starlet_kiss的博客 445

Subsequence/POJ 3061/尺取

寒假集训day1 专题1 A 尺取 来源:POJ 3061 题意:有n个数,给出m,要求找出最少的连续的数使它们的和大于等于m,并输出这些数的个数。 这应该算是模板题吧。 有两个指针去维护一段区间,可以知道当尾指针移动时,头指针也是单调移动的,所以我们只需不断更新两个指针使这段区间的和一直满足大于等于m,并不断比较区间的长度,找出最小值。 #include <cstring> #inc...

weixin_45600829的博客 148

【尺取法】POJ3061 & POJ3320

POJ3061-Subsequence 【题目大意】 给定长度微n的数列整数及整数s。求出总和不小于s的连续子序列的长度的最小值。如果节不存在,则输出0。 【思路】 尺取法五分钟裸裸裸~刷水刷出了罪恶感:( 基本做法:设置l和r代表当前区间[l,r],若S(l,r)<s,则 r++。若S(l,r)≥s,则 l++,直至S(l,r)<s。如果当前S(l,r)&...

dianchunhui2654的博客 129

尺取法 poj-3061Subsequence

尺取法,借鉴挑战程序设计竞赛,尺取法是通过对数组的下标的起点和终点,根据实际情况交替推进两个端点,最后得出答案。 题目: DescriptionA sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, and a positive integer S (S ...

qq_43227036的博客 250
上一篇: hdu 5355 Cake(贪心+搜索)
下一篇: POJ 3320 Jessica's Reading Problem(尺取法)
yphacker
博客等级 码龄12年 199粉丝 540原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值