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的子 ...
随机推荐
- C语言之推箱子游戏代码
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:Yan_Less 正文 新手注意:如果你学习遇到问题找不到人解答,可以点 ...
- Java编译器API简介
今天给大家分享的是Java编译器API简介,文章部分内容摘自[优锐课]学习笔记. Java编译器API Java编译器API是Java模块(称为java.compiler)的一部分.该模块包括语言模型 ...
- git下载问题
官网下载:打不开,可用git for Windows 下载 地址:https://github.com/git-for-windows/git/releases
- 2019年12月18日Linux开发手记
安装idle3: 1.端输入apt install idle3 以安装 2.安装完成后在终端输入idle以启动 配置pip: 1.终端输入apt install python3-pip 使用pip配置 ...
- go中的关键字-reflect 反射
1. 什么是反射 Golang提供了一种机制,在编译时不知道类型的情况下,可更新变量.运行时查看值.调用方法以及直接对他们的布局进行操作的机制,称为反射. 2. 反射的使用 2.1 获取变量内部信息 ...
- Laravel 中使用 swoole 项目实战开发案例二 (后端主动分场景给界面推送消息)
推荐阅读:Laravel 中使用 swoole 项目实战开发案例一 (建立 swoole 和前端通信) 需求分析 我们假设有一个需求,我在后端点击按钮 1,首页弹出 “后端触发了按钮 1”.后端点了 ...
- 在MSSQL中的简单数据类型递归
在某些特定的项目需求中,我们需要实现树状数据结构, 由此,我们需要用递归将数据查询出来. WITH T AS ( SELECT ID,PID FROM TableName WHERE ID=1 UNI ...
- Node6-2单元测试 覆盖率Istanbul
Step1:安装Istanbul npm install -g istanbul Step2:在package.json里面添加,具体参考Istanbul的API写法 "scripts&qu ...
- GHOST CMS - 创建自定义主页 Creating a custom home page
创建自定义主页 Creating a custom home page 为你的网站创建一个自定义的主页是一个让你从人群中脱颖而出的好方法,并把你自己独特的印记存放在你的网上.本教程向您展示了如何在Gh ...
- Vue与Django前后台分离跨域配置
一.跨域: 简单来说:如果前端向后端请求数据,前后端的的ip和端口都是不一致的,就是不在统一域名下,就出现了CORS跨域问题. 二.后台处理跨域 在django后台环境目录下安装插件: >: p ...