poj 3061 Subsequence 二分 前缀和 双指针
地址 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 二分 前缀和 双指针的更多相关文章
- Poj 3061 Subsequence(二分+前缀和)
Subsequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12333 Accepted: 5178 Descript ...
- 题解报告:poj 3061 Subsequence(前缀+二分or尺取法)
Description A sequence of N positive integers (10 < N < 100 000), each of them less than or eq ...
- POJ 3061 Subsequence 二分或者尺取法
http://poj.org/problem?id=3061 题目大意: 给定长度为n的整列整数a[0],a[1],--a[n-1],以及整数S,求出总和不小于S的连续子序列的长度的最小值. 思路: ...
- POJ 3061 Subsequence ( 二分 || 尺取法 )
题意 : 找出给定序列长度最小的子序列,子序列的和要求满足大于或者等于 S,如果存在则输出最小长度.否则输出 0(序列的元素都是大于 0 小于10000) 分析 : 有关子序列和的问题,都可以考虑采用 ...
- POJ 3061 Subsequence 二分查找
题目大意:给出长度为n的一个序列,给出一个数字S,求长度最短的序列和大于等于S的连续子序列,输出该长度,如果没有答案输出0. 题目思路:看数据范围,这道题就是卡时间的.我们可以用sum[i]记录前i项 ...
- poj 3061 Subsequence
题目连接 http://poj.org/problem?id=3061 Subsequence Description A sequence of N positive integers (10 &l ...
- POJ 3061 Subsequence【二分答案】||【尺取法】
<题目链接> 题目大意: 给你一段长度为n的整数序列,并且给出一个整数S,问你这段序列中区间之和大于等于S的最短区间长度是多少. 解题分析:本题可以用二分答案做,先求出前缀和,然后枚举区间 ...
- POJ - 3061 Subsequence(连续子序列和>=s的最短子序列长度)
Description A sequence of N positive integers (10 < N < 100 000), each of them less than or eq ...
- POJ 3061 Subsequence(Two Pointers)
[题目链接] http://poj.org/problem?id=3061 [题目大意] 给出S和一个长度为n的数列,问最短大于等于S的子区间的长度. [题解] 利用双指针获取每一个恰好大于等于S的子 ...
随机推荐
- AddTransient、AddSingleton、AddScoped的区别
权重: AddSingleton→AddTransient→AddScoped AddSingleton的生命周期: 项目启动-项目关闭 相当于静态类 只会有一个 AddScoped的生命周期: ...
- java web项目war包部署,使用tomcat对指定接口设置身份认证
先简单说一下需求: 将一个基于springboot2.0开发的java web项目打成war包,通过tomcat部署到一台linux服务器上,项目相关的一些图片等资源也按照一定规则放置在服务器构建好的 ...
- springboot使用api操作HBase之shell
HBase的基本读写流程写入流程读取流程HBase的模块与协作HBase启动RegionServer失效HMaster失效HBase常用的Shell命令进入shellhelp命令查询服务器状态查看所有 ...
- 201871010119-帖佼佼《面向对象程序设计(java)》第十一周学习总结
博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...
- 双重检查锁单例模式为什么要用volatile关键字?
前言 从Java内存模型出发,结合并发编程中的原子性.可见性.有序性三个角度分析volatile所起的作用,并从汇编角度大致说了volatile的原理,说明了该关键字的应用场景:在这补充一点,分析下v ...
- pipelineDB学习笔记-2. Stream (流)
一.流的定义: 所谓的“流”(stream)在pipelineDB中是指那些被允许的数据库客服端推送到 Continuous View(连续视图) 的时序化数据的一种“抽象”.流中的每一个raw(数据 ...
- XML字符串转为Map集合
public class xmlToMapUtils { /** * xml字符串转为map集合 * @param xmlStr * @return */ public static Map<S ...
- SpringBoot电商项目实战 — 前后端分离后的优雅部署及Nginx部署实现
在如今的SpringBoot微服务项目中,前后端分离已成为业界标准使用方式,通过使用nginx等代理方式有效的进行解耦,并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务架构.多端化服务(多 ...
- 约数之和(POJ1845 Sumdiv)
最近应老延的要求再刷<算法进阶指南>(不得不说这本书不错)...这道题花费了较长时间~(当然也因为我太弱了)所以就写个比较易懂的题解啦~ 原题链接:POJ1845 翻译版题目(其实是AcW ...
- Linux 的目录结构
原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/cbbf47b0-f ...