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

解法1

使用双指针

由于序列是连续正数

使用l r 表示选择的子序列的起始

每当和小于要求的时候 我们向右侧扩展 增大序列和

每当和大于等于要求的时候 我们将子序列左边的数字剔除 看能是在减少长度情况下 还能保持子序列和满足要求

这样在指定起点下的满足要求的最短子序列和都会被记录 然后在比较出最短长度的子序列

如图

代码

 #include <iostream>
#include <vector>
#include <algorithm>
#include <memory.h>
#include <queue> using namespace std; /*
Sample Input
6
10 15
5 1 3 5 10 7 4 9 2 8
5 11
1 2 3 4 5
1 2
1
1 1
5
3 9999
1 2 3
3 0
1 2 3 Sample Output
2
3
*/
const int MAX_N = ;
int n, m;
int nums[MAX_N]; int ret = MAX_N; void solve()
{
int sum = ;
int minlen = MAX_N; int r = -; int l = ; while () {
if (sum < m) {
r++;
if (r >= n) break;
sum += nums[r];
}
else {
//sum >= m
minlen = min(minlen, r - l + );
sum -= nums[l];
l++;
if (l >= n) break;
if (l > r) {
r = l;
sum = nums[l];
}
}
} if (minlen == MAX_N) minlen = ;
cout << minlen << endl;
} int main()
{
int loop;
cin >> loop;
while (loop--) {
cin >> n >> m; for (int i = ; i < n; i++) {
cin >> nums[i];
}
ret = MAX_N;
solve();
} return ;
}

子序列

//=========================================================================================

解法2 二分查找前缀和  todo

使用前缀和就可以快速定位各个子序列的和

然后使用二分查找进行查找以指定索引开始的子序列满足和要求的最短长度

最后得到所有满足需求中最短的子序列长度

代码如下

 #include <iostream>
#include <algorithm> using namespace std; const int MAX_N = ;
int n, m;
int nums[MAX_N];
int preSum[MAX_N]; int binartSearch(int sum[],int l, int r)
{
int start = l;
while (l < r) {
int mid = (l + r) >> ;
if (sum[mid] - sum[start] >= m) {
r = mid;
}
else {
l = mid + ;
}
} return (l-start);
} int solve()
{
int ret = MAX_N;
for (int i = ; i <= n; i++) {
preSum[i] = preSum[i - ] + nums[i];
}
//全部加起来都无法达到标准
if (preSum[n] < m) return ; for (int i = ; i < n; i++) {
//if(preSum[i]+m <= preSum[n]){
if (preSum[n] - preSum[i] >= m) {
int idx = binartSearch(preSum,i,n);
ret = min(ret, idx);
}
} if (ret == MAX_N) ret = ;
return ret;
} int main()
{
int loop;
cin >> loop; while (loop--) {
cin >> n >> m;
memset(nums,,sizeof(nums));
memset(preSum, , sizeof(preSum)); for (int i = ; i <= n; i++) {
cin >> nums[i];
}
cout << solve() << endl;
} return ;
}

poj 3061 Subsequence 二分 前缀和 双指针的更多相关文章

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

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

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

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

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

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

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

    题意 : 找出给定序列长度最小的子序列,子序列的和要求满足大于或者等于 S,如果存在则输出最小长度.否则输出 0(序列的元素都是大于 0 小于10000) 分析 : 有关子序列和的问题,都可以考虑采用 ...

  5. POJ 3061 Subsequence 二分查找

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

  6. poj 3061 Subsequence

    题目连接 http://poj.org/problem?id=3061 Subsequence Description A sequence of N positive integers (10 &l ...

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

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

  8. POJ - 3061 Subsequence(连续子序列和>=s的最短子序列长度)

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

  9. POJ 3061 Subsequence(Two Pointers)

    [题目链接] http://poj.org/problem?id=3061 [题目大意] 给出S和一个长度为n的数列,问最短大于等于S的子区间的长度. [题解] 利用双指针获取每一个恰好大于等于S的子 ...

随机推荐

  1. Python3 模块基础

    目录 模块 什么是模块 模块的四种形式 导入模块 import 模块 from 模块 import 方法 循环导入 模块搜索路径 Python文件的两种用途 包 什么是包 为什么要有包 包的使用 绝对 ...

  2. 解决老浏览器不支持ES6的方法

    转载地址:http://www.rockyxia.com/?p=669 为什么ES6会有兼容性问题? 由于广大用户使用的浏览器版本在发布的时候也许早于ES6的定稿和发布,而到了今天,我们在编程中如果使 ...

  3. RNN循环神经网络

    1.为什么还会有RNN? CNN(卷积神经网络)我们会发现, 他们的输出都是只考虑前一个输入的影响而不考虑其它时刻输入的影响, 比如简单的猫,狗,手写数字等单个物体的识别具有较好的效果. 但是, 对于 ...

  4. TOMCAT启动报错:org.apache.tomcat.jni.Error: 730055

    TOMCAT启动报错:org.apache.tomcat.jni.Error: 730055 具体原因:不清楚 解决方式:重启应用服务器后,再启动tomcat就可以了 欢迎关注公众号,学习kettle ...

  5. 《Dotnet9》系列-FluentValidation在C# WPF中的应用

    时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...

  6. SpringBoot电商项目实战 — ElasticSearch接入实现

    如今在一些中大型网站中,搜索引擎已是必不可少的内容了.首先我们看看搜索引擎到底是什么呢?搜索引擎,就是根据用户需求与一定算法,运用特定策略从互联网检索出制定信息反馈给用户的一门检索技术.搜索引擎依托于 ...

  7. Caffe源码-Layer类

    Layer类简介 Layer是caffe中搭建网络的基本单元,caffe代码中包含大量Layer基类派生出来的各种各样的层,各自通过虚函数 Forward() 和 Backward() 实现自己的功能 ...

  8. Android获取ROOT权限的通用方法

    背景 自从Android问世以后,给手机获取ROOT权限变成了玩机爱好者老生常谈的话题.拥有手机,却不能拥有操作手机的最高权限,这对于手机爱好者而言,这怎么可以忍?所以无论Android升到什么什么版 ...

  9. CouchDB学习-介绍

    官方文档 CouchDB 1文档存储 CouchDB服务器主机是一个存储文档的数据库.每一个文档在数据库中都有唯一的名字.CouchDB提供RESTful HTTP API用来读取和更新(添加,编辑, ...

  10. 在Mac上Python多版本切换

    1.安装Homebrewhttps://brew.sh/index_zh-cn.html 2.通过brew安装pyenv1)命令行输入:$ brew install pyenv(如果一直卡在Updat ...