UVA之1121 - Subsequence
版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/SunnyYoona/article/details/25840365
【题目】
A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, and a positive integer S (S <
100 000 000) are given. Write a program to find the minimal length of the subsequence of consecutive elements of the sequence, the sum of which is greater than or equal to S.
Input
Many test cases will be given. For each test case the program has to read the numbers N and S, separated by an interval, from the first line.
The numbers of the sequence are given in the second line of the test case, separated by intervals. The input will finish with the end of file.
Output
For each the case the program has to print the result on separate line of the output file. If there isn't such a subsequence, print 0 on a line by itself.
Sample Input
10 15
5 1 3 5 10 7 4 9 2 8
5 11
1 2 3 4 5
Sample Output
2
3
【分析】
本题最直接的思路是二重循环,枚举子序列的起点和终点。
代码例如以下(输入数据已存入数组A[1]~A[n])。
int ans = n+1;
for(int i = 1; i <= n; i++)
for(int j = i; j <= n; j++) {
int sum = 0;
for(int k = i; k <= j; k++) sum += A[k];
if(sum >= S) ans = min(ans, j-i+1);
}
printf("%d\n", ans == n+1 ? 0 : ans);
非常可惜,上述程序的时间复杂度是O(n3)的,因此,当n达到100 000的规模后,程序将无能为力。
有一个方法能够减少时间复杂度。即常见的前缀和技巧。
令Bi=A1+A2+…+Ai,规定B0=0,则能够在O(1)时间内求出子序列的值:Ai+Ai+1+…+Aj=Bj-Bi-1。
这样。时间复杂度降为O(n2),代码例如以下。
B[0] = 0;
for(int i = 1; i <= n; i++) B[i] = B[i-1] + A[i];
int ans = n+1;
for(int i = 1; i <= n; i++)
for(int j = i; j <= n; j++)
if(B[j] - B[i-1] >= S) ans = min(ans, j-i+1);
printf("%d\n", ans == n+1 ? 0 : ans);
遗憾的是,本题的数据规模太大。O(n2)时间复杂度的算法也太慢。
不难发现,仅仅要同一时候枚举起点和终点,时间复杂度不可能比O(n2)更低,所以必须另谋他路。比方,能否够不枚举终点。仅仅枚举起点。或者不枚举起点,仅仅枚举终点呢?
我们首先试试仅仅枚举终点。对于终点j,我们的目标是要找到一个让Bj-Bi-1≥S。且i尽量大(i越大。序列长度j-i+1就越小)的i值。也就是找一个让Bi-1≤Bj-S最大的i。考虑图1-29所看到的的序列。
当j=5时。B5=12,因此目标是找一个Bi-1≤12-7=5的最大i。注意到B是递增的(别忘了,本题中全部Ai均为整数),所以能够用二分查找。
【代码】
/*********************************
* 日期:2014-5-14
* 作者:SJF0115
* 题号: 1121 - Subsequence
* 地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=246&page=show_problem&problem=3562
* 来源:UVA
* 结果:Accepted
**********************************/
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define N 100001
int A[N];
int B[N];
//二分查找最接近target但不大于target
int BinarySerach(int target,int R){
int L = 0;
int mid = 0;
while(L < R){
mid = L + (R - L) / 2;
if(B[mid] > target){
R = mid;
}
else{
L = mid + 1;
}
}
return L;
}
int main(){
int n,s,i,j;
//freopen("C:\\Users\\wt\\Desktop\\acm.txt","r",stdin);
while(scanf("%d %d",&n,&s) != EOF){
int minLen = n+1;
B[0] = 0;
for(i = 1;i <= n;i++){
scanf("%d",&A[i]);
//序列前缀和
B[i] = B[i-1] + A[i];
}
for(j = 1;j <= n;j++){
int target = B[j] - s;
//二分查找
int index = BinarySerach(target,j-1);
if(index > 0){
minLen = min(minLen,j-index+1);
}
}
//没有满足条件的序列
if(minLen == n+1){
minLen = 0;
}
cout<<minLen<<endl;
}//while
return 0;
}
【类似题目】
UVA之1121 - Subsequence的更多相关文章
- UVA 11404 Palindromic Subsequence[DP LCS 打印]
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...
- LPS UVA 11404 Palindromic Subsequence
题目传送门 题意:求LPS (Longest Palidromic Subsequence) 最长回文子序列.和回文串不同,子序列是可以不连续的. 分析:1. 推荐->还有一种写法是用了LCS的 ...
- uva 1121 Subsequence
https://vjudge.net/problem/UVA-1121 题意: 给出一个正整数数列a,要求找出最短的连续的一个序列使得这个序列的所有数字之和大于等于S. 思路: 第一是由于序列都是正整 ...
- UVA 11404 Palindromic Subsequence
Palindromic Subsequence Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA ...
- 【UVa】Palindromic Subsequence(dp+字典序)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=s ...
- UVa 10747 - Maximum Subsequence
题目大意:给出n个数,从中选取k个,使得乘积最大,并且尽量使和最大 分析:首先按照数的绝对值大小排序.然后就要分三大类情况讨论: (1)前k个中选到0:如果选到0的话,乘积一定是0,所以尽量选大的数, ...
- UVa 11404 Palindromic Subsequence (LCS)
题意:给定一个字符串,问删除一些字符,使得它成为一个最长回访串,如果有多个,输出字典序最小的那个. 析: 我们可以把原字符串反转,然后求两个串的LCS,就得到最长回文串,不过要注意一些细节. 代码如下 ...
- uva 11404 dp
UVA 11404 - Palindromic Subsequence 求给定字符串的最长回文子序列,长度一样的输出字典序最小的. 对于 [l, r] 区间的最长回文串.他可能是[l+1, r] 和[ ...
- ACM 杂题,思路题 整理
UVa 11572 - Unique Snowflakes 问一个数组中,无重复数字的最长子串长度是多少. 用map维护某数字上次出现的位置.另外用变量last表示上次出现数字重复的位置. 如果出现重 ...
随机推荐
- CTR预估中的贝叶斯平滑方法(一)原理及实验介绍
1. 背景介绍 广告形式: 互联网广告可以分为以下三种: 1)展示广告(display ad) 2)搜索广告(sponsored search ad) 3)上下文广告(contextual ad) ...
- 随机生成气泡碰撞(原生js)
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>随 ...
- Python3:Requests模块的异常值处理
Python3:Requests模块的异常值处理 用Python的requests模块进行爬虫时,一个简单高效的模块就是requests模块,利用get()或者post()函数,发送请求. 但是在真正 ...
- 20145319 《网络对抗》逆向与Bof基础
20145319 逆向与Bof实验 1 实验内容 本次实验以可执行文件pwn1为例,将对pwn1进行反汇编的基础上进行功能上的解读,并进行缓冲区溢出攻击 可执行文件pwn1的正常流程是主函数调用foo ...
- jz2440-uboot-201204版本移植【学习笔记】【原创】
平台:jz2440 作者:庄泽彬(欢迎转载,请注明作者) 说明:韦东山二期视频学习笔记 交叉编译工具:arm-linux-gcc (GCC)4.3.2 PC环境:ubuntu18.04 一.uboot ...
- 前端工程化 - bower
什么是bower bower是前端的包管理工具,类似于php的composer,python的pip,虽然先如今bower已经停止了更新(主要是因为Browserify和Webpack等包管理工具的兴 ...
- 《Blue Flke团队》第二次作业通讯录项目开题报告
Just_Do_IT! N:8A:8B:7C:6D:8总分:37 Miracle-House N:8A:6B:7C:6D:8总分:35 Spring_Four N:7A:7B:8C:8D: ...
- Java回顾之序列化
在这篇文章里,我们关注对象序列化. 首先,我们来讨论一下什么是序列化以及序列化的原理:然后给出一个简单的示例来演示序列化和反序列化:有时有些信息是不应该被序列化的,我们应该如何控制:我们如何去自定义序 ...
- 【Mysql】修改mysql的字符集和默认存储引擎,解决数据入库乱码问题
背景 在使用Python + Testlink做自动化的过程中,遇到了数据入库出现乱码的情况,后来通过修改字符集的方式解决了这个问题.下面的内容主要来自于一篇相关博文,博主做了细微的调整, 原文链接: ...
- PHP如何生成文章预览图
PHP如何生成文章预览图 一.总结 一句话总结:php的wkhtmltox扩展,php官方文档有怎么使用,或者github,或者百度,等等等等 wkhtmltox 1.PHP如何自动生成文章预览图? ...