题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=679

解题报告:给定一个正整数的序列,和一个S,求长度最短的子序列,使它们的和大于或等于S。序列长度n <= 100000

很明显,如果枚举起点和终点的话,时间复杂度是O(n^3),不行。怎么能在O(1)时间求出一个子序列的和是多少呢,可以用另一个数组sum[i],意义是第一个到

第i个数的和是sum[i],这样的话就可以做到在O(1)时间求出一个子序列的和,但这样还是不够,我的做法是只枚举子序列的终点,然后找到一个j使得sum[j] >= sum[i] - S,那么这个子序列的长度就是i - j + 1,因为sum[i]是递增的,在查找j的位置的时候用二分查找,所以,这样就把时间复杂度降到了n*log2(n),就可以过了。

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = ;
int A[maxn],sum[maxn]; int find(int *B,int l,int r,int d)
{
while(l < r)
{
int mid = (l + r) >> ;
if(d <= B[mid]) r = mid;
else l = mid + ;
}
return l;
} int main()
{
int n,s;
while(scanf("%d%d",&n,&s)!=EOF)
{
int k = ;
sum[] = ;
for(int i = ;i <= n;++i)
{
scanf("%d",&A[i]);
sum[i] = sum[i-] + A[i];
if(k == && sum[i] >= s) k = i;
}
int ans = 0x7fffffff;
for(int i = k;i <= n;++i)
{
int t = find(sum,,i,sum[i] - s);
if(sum[t] > sum[i]-s) t--;
ans = min(ans,i - t);
}
printf(ans > ? "0\n":"%d\n",ans);
}
return ;
}

LA 2678 Subsequence(二分查找)的更多相关文章

  1. LA 2678 Subsequence

    有一个正整数序列,求最短的子序列使得其和大于等于S,并输出最短的长度. 用数组b[i]存放序列的前i项和,所以b[i]是递增的. 遍历终点j,然后在区间[0, j)里二分查找满足b[j]-b[i]≥S ...

  2. LA 2678 – Subsequence

    看到限时3S,自己写了一个二重循环的,然后华丽的 TLE...T T 瞄了瞄书上,作者的思路果然是很好.膜拜中. 他只枚举了终点,然后用二分查找. 用到了lower_bound函数,这个lower_b ...

  3. POJ 3061 Subsequence 二分查找

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

  4. 【二分查找+优化O(n)】【续UVA1121】Subsequence

    之前的二分答案做法 http://blog.csdn.net/zy691357966/article/details/40212215 二分查找做法: 我们首先试试只枚举终点.对于终点j,我们的目标是 ...

  5. 1085. Perfect Sequence (25) -二分查找

    题目如下: Given a sequence of positive integers and another positive integer p. The sequence is said to ...

  6. POJ——3061Subsequence(尺取法或二分查找)

    Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11224   Accepted: 4660 Desc ...

  7. jvascript 顺序查找和二分查找法

    第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...

  8. Java实现的二分查找算法

    二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...

  9. 从一个NOI题目再学习二分查找。

    二分法的基本思路是对一个有序序列(递增递减都可以)查找时,测试一个中间下标处的值,若值比期待值小,则在更大的一侧进行查找(反之亦然),查找时再次二分.这比顺序访问要少很多访问量,效率很高. 设:low ...

随机推荐

  1. hihoCoder1284机会渺茫(唯一分解定理 + 约分)

    题目链接 #1284 : 机会渺茫 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在追求一名学数学的女生小Z.小Z其实是想拒绝他的,但是找不到好的说辞,于是提出 ...

  2. Linux C/C++ --- “” and <> in the use of head include file(Pending Verification)

    for example: #include <stdlib.h>#include <stdio.h>#include <wiringPi.h>#include &l ...

  3. linux第一面

    随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起.作为一个 Linux系统管理员,我看了许多有关Linux的文档和书籍,并为学习 ...

  4. uC/OS-II中includes块

    /*************************************************************************************************** ...

  5. 基础SQL语句

    SQL语句: 1.插入 方法一: "INSERT INTO [DB].[dbo].[T_Table] ([ID],[Name],[Amount],[Creater],[CreatedOn], ...

  6. OpenGL Tutorial

    https://open.gl https://www.processing.org/tutorials/pshader/

  7. C语言进行面向对象编程

    http://blog.csdn.net/dadalan/article/details/3983888 http://blog.163.com/zhqh43@126/blog/static/4043 ...

  8. gl_ClipDistance

    http://github.prideout.net/clip-planes/ http://www.opengl.org/wiki/Built-in_Variable_(GLSL) http://w ...

  9. Webpack 之 Loader 的使用

    安装 loaders 如果loader在npm里,可以这样安装: $ npm install xxx-loader --save 或者 $ npm install xxx-loader --save- ...

  10. [FMX] Android APP 启动黑屏优化补丁

    使用说明 *************************************************** Android APP 启动黑屏优化补丁 作者: Swish, YangYxd 201 ...