题目链接:http://poj.org/problem?id=3061

题意:给n个正整数和一个数S,求出总和不小于S的连续子序列的长度的最小值,如果无解输出0;

我们可以用sum[i]表示前i项的和;然后二分枚举找答案即可时间复杂度为O(n*logn)的;

#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<math.h>
using namespace std;
#define N 120000
#define PI 4*atan(1.0)
#define mod 110119
#define met(a, b) memset(a, b, sizeof(a))
typedef long long LL; int a[N], n, s, sum[N]; int Judge(int len)
{
for(int i=; i+len-<=n; i++)
{
if(sum[i+len-]-sum[i-]>=s)
return ;
}
return ;
} int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d %d", &n, &s); for(int i=; i<=n; i++)
{
scanf("%d", &a[i]);
sum[i] = sum[i-] + a[i];
} int L = , R = n, Min = ; while(L <= R)
{
int Mid = (L+R)/;
if(Judge(Mid))
{
Min = Mid;
R = Mid-;
}
else
L = Mid+;
}
printf("%d\n", Min);
}
return ;
}

还可以用尺取法,就是用两个指针控制一下头和尾,然后移动即可;时间复杂度是O(n)的;

#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<math.h>
using namespace std;
#define N 120000
#define PI 4*atan(1.0)
#define mod 110119
#define met(a, b) memset(a, b, sizeof(a))
typedef long long LL; int a[N], n, s; int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d %d", &n, &s); for(int i=; i<=n; i++)
scanf("%d", &a[i]); int L = , R = , ans = n+, sum = ; while()
{
while(R<=n && sum<s)
sum += a[R++];
if(sum < s) break;
ans = min(ans, R-L);
sum -= a[L++];
}
if(ans == n+)ans = ;
printf("%d\n", ans);
}
return ;
}

Subsequence---poj3061(尺取法||二分)的更多相关文章

  1. poj3061 Subsequence(尺取法)

    https://vjudge.net/problem/POJ-3061 尺取发,s和t不断推进的算法.因为每一轮s都推进1所以复杂度为O(n) #include<iostream> #in ...

  2. poj3061 Subsequence ,尺取法

    A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, a ...

  3. POJ3061 尺取法

    题目大意:从给定序列里找出区间和大于等于S的最小区间的长度. 前阵子在zzuli OJ上见过类似的题,还好当时补题了.尺取法O(n) 的复杂度过掉的.尺取法:从头遍历,如果不满足条件,则将尺子尾 部增 ...

  4. poj3061尺取法

    A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, a ...

  5. POJ 3061 Subsequence ( 尺取法)

    题目链接 Description A sequence of N positive integers (10 < N < 100 000), each of them less than ...

  6. poj 3061 题解(尺取法|二分

    题意 $ T $ 组数据,每组数据给一个长度 $ N $ 的序列,要求一段连续的子序列的和大于 $ S $,问子序列最小长度为多少. 输入样例 2 10 15 5 1 3 5 10 7 4 9 2 8 ...

  7. Codeforces 1156C 尺取法 / 二分

    题意:给你一个数组,问里面最多能匹配出多少对,满足abs(a[i] - a[j]) >= k; 思路:首先肯定要排序. 思路1(尺取法):看了dreamoon的代码明白的.我们可以寻找一个最长的 ...

  8. 【UVALive】2678 Subsequence(尺取法)

    题目 传送门:QWQ 分析 一开始没看到都是正整数根本不会做...... 看到了就是水题了.(但还是sb WA了一发) 尺取法搞一搞 代码 #include <bits/stdc++.h> ...

  9. poj3061 Subsequence【尺取法】

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

随机推荐

  1. Qt Creator build遇到error lnk1158 无法运行rc.exe

    解决办法: 将C:\Program Files (x86)\Windows Kits\10\bin\10.0.15063.0\x64 目录下的rc.exe 和rcdll.dll 复制到 C:\Prog ...

  2. 解决“”父级标签和子标签边框重叠,设置子标签的margin父标签会跟着移动“”的方法

    1.可以给父标签一个padding,然后给一个很小的值,虽然不影响整体但是不建议使用 2.给父标签一个"over:hidden"的样式,推荐使用

  3. 从零开始学Sketch——进阶篇

    本文转自 http://www.jianshu.com/p/ff70b5f35c8f 从零开始学Sketch——进阶篇 Sketch是一款矢量绘图应用,而矢量绘图无疑是目前进行网页.图标以及界面设计的 ...

  4. Myeclipse10使用git

    用Myeclipse安装egit,使用官网最新地址或者下载最新的egit插件到本地安装均在team中看不到git,最后发现到http://download.eclipse.org/egit/updat ...

  5. 【分享】Linux(Ubuntu)下如何自己编译JDK

    最近在看<深入理解 Java 虚拟机>这本书.里面提到了如何手动编译JDK,于是就试了试. 在编译的过程中,遇到了一些问题.上网一搜,发现了一篇很好的文章,跟大家分享一下:ubuntu 1 ...

  6. 如何使用 Flexbox 和 CSS Grid,实现高效布局

    CSS 浮动属性一直是网站上排列元素的主要方法之一,但是当实现复杂布局时,这种方法不总是那么理想.幸运的是,在现代网页设计时代,使用 Flexbox 和 CSS Grid 来对齐元素,变得相对容易起来 ...

  7. LeetCode 24 Swap Nodes in Pairs (交换相邻节点)

    题目链接: https://leetcode.com/problems/swap-nodes-in-pairs/?tab=Description   Problem: 交换相邻的两个节点     如上 ...

  8. js json转字符串

    在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键.例如:JSON字符串:var str1 = '{ &quo ...

  9. VIM 的一些技巧

    vim配置文件 ~/.vimrc 如果没有自己创建一个即可 filetype plugin indent on #打开插件 set number #显示行号 syntax on #语法高亮 set c ...

  10. H3C系列之三层交换机文件管理

    笔者本篇文章所用h3c交换机的型号为三层交换机S3600-28TP-SI 对于文件的操作一般都在用户视图下操作,常见的有如下一些操作: 1.查看操作,常用的查看操作可以使用如下命令: <H3C& ...