LA 2678 – Subsequence
看到限时3S,自己写了一个二重循环的,然后华丽的 TLE。。。T
T
瞄了瞄书上,作者的思路果然是很好。膜拜中。
他只枚举了终点,然后用二分查找。
用到了lower_bound函数,这个lower_bound(first,last,val)在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置。
简单的说,就是当val存在时,返回它出现的第一个位置。如果不存在,就返回一个这样的下标i,在此处插入val(原来的元素sum[i],sum[i+1]…全部往后移动一位)后序列仍然有序。
而upper_bound就是当val存在时,返回它出现的最后一个位置。如果不存在,就返回一个这样的下标i,在此处插入val(原来的元素sum[i],sum[i+1]…全部往后移动一位)后序列仍然有序。
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=100000+10;
int sum[MAXN];
int main()
{
int n,s,t;
while(scanf("%d%d",&n,&s)!=EOF)
{
sum[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&t);
sum[i]=sum[i-1]+t;
}
int ans=n+1;
for(int i=1;i<=n;i++)
{
if(sum[i]-s>0)
{
int j=lower_bound(sum,sum+i,sum[i]-s)-sum;
ans=min(ans,i-j+1);
}
}
printf("%d\n",ans==n+1 ? 0:ans);
}
}
作者进一步优化的代码就更好了,因为i是递增的,sum也是递增的,所以sum[j]<=sum[i]-s也是递增的,就是说满足条件j的位置也是递增的
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=100000+10;
int sum[MAXN];
int main()
{
int n,s,t;
while(scanf("%d%d",&n,&s)!=EOF)
{
sum[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&t);
sum[i]=sum[i-1]+t;
}
int ans=n+1,j=0;
for(int i=1;i<=n;i++)
{
if(sum[i]-s<0)continue;
while(sum[i]-sum[j]>=s) j++;
ans=min(ans,i-j+1);
}
printf("%d\n",ans==n+1 ? 0:ans);
}
}
LA 2678 – Subsequence的更多相关文章
- LA 2678 Subsequence(二分查找)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- LA 2678 Subsequence
有一个正整数序列,求最短的子序列使得其和大于等于S,并输出最短的长度. 用数组b[i]存放序列的前i项和,所以b[i]是递增的. 遍历终点j,然后在区间[0, j)里二分查找满足b[j]-b[i]≥S ...
- LA 3029 Subsequence
LA 3029 A sequence of N positive integers (10 < N < 100 000), each of them less than or equal ...
- [UVALive 2678] Subsequence
图片加载可能有点慢,请跳过题面先看题解,谢谢 在切水题的道路上狂奔,一发不可收拾... 这道题好像不用写什么题解吧,吐个槽什么的算了 一眼题,大佬们都不屑于做,只有我这种弱菜才来写这种题目玩儿 记个前 ...
- 【UVALive】2678 Subsequence(尺取法)
题目 传送门:QWQ 分析 一开始没看到都是正整数根本不会做...... 看到了就是水题了.(但还是sb WA了一发) 尺取法搞一搞 代码 #include <bits/stdc++.h> ...
- SPOJ 274 Johnny and the Watermelon Plantation(TLE)
O(n^3)的时间复杂度,改了半天交了二三十遍,TLE到死,实在没办法了…… 跪求指点!!! #include <cstdio> #include <cstdlib> #inc ...
- 【uva 1471】Defense Lines(算法效率--使用数据结构+部分枚举+类贪心)
P.S.我完全一个字一个字敲出来的血泪史啊~~所以,没有附代码,也是可以理解的啦.OvO 题意:给一个长度为N(N≤200000)的序列,要删除一个连续子序列,使得剩下的序列中有一个长度最大的连续递增 ...
- HDU 1159:Common Subsequence(LCS模板)
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- UVA10100:Longest Match(最长公共子序列)&&HDU1458Common Subsequence ( LCS)
题目链接:http://blog.csdn.net/u014361775/article/details/42873875 题目解析: 给定两行字符串序列,输出它们之间最大公共子单词的个数 对于给的两 ...
随机推荐
- js--11对象的创建方式
<html> <head> <title>Object</title> </head> <body> <script ty ...
- virtual与override
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- php输出杨辉三角
php输出杨辉三角 一.截图 二.代码 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- button按钮怎么实现超链接
button按钮怎么实现超链接 一.总结 1.我的按钮实现超链接是通过button内嵌a标签来实现的 <button class="am-btn am-btn-default am-b ...
- BZOJ3994: [SDOI2015]约数个数和(莫比乌斯反演)
Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. Out ...
- 三分钟上手Highcharts简易甘特图
根据业务需求,找到了这个很少使用的图形,话不多说,看看该如何使用.首先要引入支持文件:可根据链接下载. exporting.js:https://img.hcharts.cn/highcharts/m ...
- ZJU 2425 Inversion
Inversion Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on ZJU. Original ID: ...
- Highcharts图表的注解功能
Highcharts图表的注解功能 在图表中,往往须要对图表总体或者部分元素进行对应注解.帮助浏览者阅读图表.尽管标签组labels能够实现类似的功能.可是其功能相对简单.要实现复杂的注解功能,用户能 ...
- javaEE之------Spring-----》 AspectJ注解
前面介绍了下Spring中的切面技术.如今说下採用注解的方式进行切面 首先肯定和之前的一样.须要一个自己主动代理的注解类 AnnotationAwareAspectJAutoProxyCreator ...
- try {}里有一个return语句 finally执行顺序
先看例子 package example; class Demo{ public static void main(String args[]) { int x=1; System.out.print ...