【二分查找+优化O(n)】【续UVA1121】Subsequence
之前的二分答案做法
http://blog.csdn.net/zy691357966/article/details/40212215
二分查找做法:
我们首先试试只枚举终点。对于终点j,我们的目标是要找到一个让Bj-Bi-1≥S,且i尽量大(i越大,序列长度j-i+1就越小)的i值,也就是找一个让Bi-1≤Bj-S最大的i。注意到B是递增的(别忘了,本题中所有Ai均为整数),所以可以用二分查找。(如果不是整数的话可以用之前的二分答案做法)
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define oo 0x13131313
#define maxn 100000+100
using namespace std;
int n,S;
int A[maxn];
int ans;
void input()
{
ans=oo;
for(int i=1;i<=n;i++)
{
scanf("%d",&A[i]);
A[i]+=A[i-1];
}
}
int find(int n)
{
int s=1,e=n,m=0;
if(A[n]-A[s-1]<S) return -1;
while(s<e)
{
m=(s+e)/2+1;
if(A[n]-A[m-1]>=S)
s=m;
else
e=m-1;
}
return s;
}
int main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
int k;
while(cin>>n>>S)
{
input();
for(int i=1;i<=n;i++)
{
k=find(i);
if(k!=-1)
{
ans=min(ans,i-k+1);
}
}
if(ans==oo)
ans=0;
cout<<ans<<endl;
}
}
继续优化:
上面代码的时间复杂度是O(nlogn)。可以将其继续优化到O(n)。由于j是递增的,Bj也是递增的,所以Bi-1≤Bj-S的右边也是递增的。换句话说,满足条件的i的位置也是递增的。因此我们可以写出这样的程序。
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define oo 0x13131313
#define maxn 100000+100
using namespace std;
int n,S;
int A[maxn];
int ans;
void input()
{
ans=oo;
for(int i=1;i<=n;i++)
{
scanf("%d",&A[i]);
A[i]+=A[i-1];
}
}
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
while(cin>>n>>S)
{
int i=1;
input();
for(int j=1;j<=n;j++)
{
if(A[j]-A[i-1]>=S)
{
while(A[j]-A[i-1]>=S&&i<=j)
{
ans=min(ans,j-i+1);
i++;
}
}
}
if(ans==oo) ans=0;
cout<<ans<<endl;
}
}
【二分查找+优化O(n)】【续UVA1121】Subsequence的更多相关文章
- 集训第四周(高效算法设计)N题 (二分查找优化题)
原题:poj3061 题意:给你一个数s,再给出一个数组,要求你从中选出m个连续的数,m越小越好,且这m个数之和不小于s 这是一个二分查找优化题,那么区间是什么呢?当然是从1到数组长度了.比如数组长度 ...
- 南理第八届校赛同步赛-F sequence//贪心算法&二分查找优化
题目大意:求一个序列中不严格单调递增的子序列的最小数目(子序列之间没有交叉). 这题证明贪心法可行的时候,可以发现和求最长递减子序列的长度是同一个方法,只是思考的角度不同,具体证明并不是很清楚,这里就 ...
- 集训第四周(高效算法设计)B题 (二分查找优化题)
---恢复内容开始--- Description Before the invention of book-printing, it was very hard to make a copy of ...
- 集训第四周(高效算法设计)C题 (二分查找优化题)
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- LIS 问题 二分查找优化
按n=5,a-{4,2,3,1,5}为例 dp的值依次是: INF INF INF INF INF 4 INF INF INF INF 2 INF INF INF INF 2 ...
- 从三数之和看如何优化算法,递推-->递推加二分查找-->递推加滑尺
人类发明了轮子,提高了力的使用效率. 人类发明了自动化机械,将自己从重复的工作中解脱出来. 提高效率的方法好像总是离不开两点:拒绝无效劳动,拒绝重复劳动.人类如此,计算机亦如是. 前面我们说过了四数之 ...
- 【学习记录】二分查找的C++实现,代码逐步优化
二分查找的思想很简单,它是针对于有序数组的,相当于数组(设为int a[N])排成一颗二叉平衡树(左子节点<=父节点<=右子节点),然后从根节点(对应数组下标a[N/2])开始判断,若值& ...
- LA 2678 Subsequence(二分查找)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- 从一个NOI题目再学习二分查找。
二分法的基本思路是对一个有序序列(递增递减都可以)查找时,测试一个中间下标处的值,若值比期待值小,则在更大的一侧进行查找(反之亦然),查找时再次二分.这比顺序访问要少很多访问量,效率很高. 设:low ...
随机推荐
- 某APK中使用了动态注册BroadcastReceiver,Launcher中动态加载此APK出现java.lang.SecurityException异常的解决方法
在某APK中,通过如下方法动态注册了一个BroadcastReceiver,代码参考如下: @Override protected void onAttachedToWindow() { super. ...
- 飘逸的python - 解决一个有限制的组合需求
假设有一个团队技能的需求. 这类技能是要集齐所有指定的人就能激活. 但是因为同一个人又2种身份存在,比如杨戬/神杨戬,于是便产生了组合. 这种组合跟普通组合不一样,普通组合可以随意组合.而这种组合是每 ...
- [CSS3] CSS Display Property: Block, Inline-Block, and Inline
Understanding the most common CSS display types of block, inline-block, and inline will allow you to ...
- Dalvik虚拟机的运行过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8914953 在前面一篇文章中,我们分析了Dal ...
- HDUJ 2074 叠筐 模拟
叠筐 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- boost库在工作(39)网络UDP异步服务端之九
前面创建的UDP服务器和客户端,都是同步的方式,也就是说当接收数据时,不能参与别的事情执行的.如果在一个只有界面线程的程序里,又不想创建多线程,导致复杂程度的增加,在这种情况之下,我们还有一个方案可以 ...
- CMarkUp读写XML(转)
Fast start to XML in C++ Enough bull. You want to create XML or read and find things in XML. All you ...
- Velocity浅析及与Jsp、Freemarker对比
转载自:http://www.cnblogs.com/petermsdn/archive/2011/05/06/2039178.html Velocity 是一个基于java 的模板引擎(templa ...
- setInterval()-----------js 函数总结
setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭.由 s ...
- 数字转化为人民币大写(PHP)
<?php function numTrmb($num) { $d = array("零", "壹", "贰", "叁&qu ...