地址 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. matlab画二叉树

    用matlab画如下图的二叉树. 先按树的先序遍历把结点编号,如下图所示. treeplot函数的序列用如下方法得到.从根结点开始先序遍历,依次写下父结点的编号,设根结点的父结点为0.按先序遍历,根结 ...

  2. protobuf-rpm

    ############################################################## # http://www.rpm.org/max-rpm/ch-rpm-i ...

  3. 把JSON转换成键值对

    public static Dictionary<string, string> JsonStringToKeyValuePairs(string jsonStr) { char json ...

  4. 如何在Ubuntu上给软件创建快捷方式

    特殊方法:在搜索栏搜索程序  然后在快捷栏 反键 锁定在启动器     默认情况下,Ubuntu会将自动安装的软件快捷方式保存在/usr/share/applications目录下,如果我们要创建桌面 ...

  5. Mysql数据库优化一:集群(读写分离)之主从服务器的安装与配置

    Mysql数据库的集群(读写分离),说白了就是将读操作和写操作分开在不同的服务器上实现,以达到提高效率的目的. 大致原理如下: 数据库中的所有操作都是有日志记录的(前提是要打开这个日志记录功能) 1. ...

  6. Node6-2单元测试 覆盖率Istanbul

    Step1:安装Istanbul npm install -g istanbul Step2:在package.json里面添加,具体参考Istanbul的API写法 "scripts&qu ...

  7. 深入探索Java设计模式之构建器模式(五)

    抽丝剥茧 细说架构那些事——[优锐课] 简单的程序不需要大量的设计过程,因为它们只关注有限的解决方案,仅使用几个类.大型程序专注于广泛的设计,该设计比好的设计范例的任何其他属性都更能利用可重用性.宏伟 ...

  8. SQLHelper.cs类 微软C#版

    using System; using System.Data; using System.Xml; using System.Data.SqlClient; using System.Collect ...

  9. ELK查询命令详解

    目录 ELK查询命令详解 倒排索引 使用ElasticSearch API 实现CRUD 批量获取文档 使用Bulk API 实现批量操作 版本控制 什么是Mapping? 基本查询(Query查询) ...

  10. DevExpress的LookUpEdit怎样不显示列名

    场景 DevExpress的下拉框控件LookUpEdit的使用.添加item选项值.修改默认显示值: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/articl ...