uvalive2678Subsequence

简介: 题意:有n个正整数组成一个序列,给定整数S,求长度最短的连续序列,使得他们的和大于等于S 分析:设输入的序列为A[i], i=1..n, 构造前缀数组B[j], j=1..n, B[j]=B[j-1]+A[j], 规定B[0]=0, 当B[j]-B[i-1]>=s的时候i增加,直至B[j]-B[i...

题意:有n个正整数组成一个序列,给定整数S,求长度最短的连续序列,使得他们的和大于等于S

分析:设输入的序列为A[i], i=1..n, 构造前缀数组B[j], j=1..n, B[j]=B[j-1]+A[j], 规定B[0]=0, 当B[j]-B[i-1]>=s的时候i增加,直至B[j]-B[i]<s, 然后更新最短的满足条件的序列的长度j-i+1,复杂度为O(n)

代码:

View Code
 1 #include <stdio.h>
 2 #include <iostream>
 3 using namespace std;
 4 #define DEBUG
 5 const int MAXN = 100000 + 10;
 6 int a[MAXN];
 7 int b[MAXN];
 8 int min(int a, int b){
 9     return a<b?a:b;
10 }
11 int main(){
12 #ifndef DEBUG
13     freopen("in.txt", "r", stdin);
14 #endif
15     int n, s;
16     while(scanf("%d%d", &n, &s)!=EOF){
17         int i;
18         b[0]=0;
19         for(i=1; i<=n; i++){
20             scanf("%d", &a[i]);
21             b[i] = b[i-1] + a[i];
22         }
23         int ans=n+1;
24         i=1;
25         int j;
26         for(j=1; j<=n; j++){
27             if(b[i-1]>b[j]-s) continue;
28             while(b[i]<=b[j]-s) i++;
29             ans = min(ans, j-i+1);
30         }
31         if(ans==n+1) ans=0;
32         printf("%d\n", ans);
33     }
34     return 0;
35 }

如果暴力,O(n3)显然不行;如果用upper_bound则为O(n*log(n))

目录
相关文章
Leetcode 516. Longest Palindromic Subsequence
找到一个字符串的最长回文子序列,这里注意回文子串和回文序列的区别。子序列不要求连续,子串(substring)是要求连续的。leetcode 5. Longest Palindromic Substring就是求连续子串的。
58 0
|
3月前
|
算法
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
这篇文章介绍了动态规划算法中解决最大上升子序列问题(LIS)的方法,包括问题的描述、动态规划的步骤、状态表示、递推方程、计算最优值以及优化方法,如非动态规划的二分法。
85 0
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
LeetCode 376. Wiggle Subsequence
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。
103 0
LeetCode 376. Wiggle Subsequence
|
索引
LeetCode 392. Is Subsequence
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
109 0
LeetCode 392. Is Subsequence
|
算法
LeetCode 300. Longest Increasing Subsequence
给定一个无序的整数数组,找到其中最长上升子序列的长度。
58 0
LeetCode 300. Longest Increasing Subsequence
|
算法
LeetCode 334. Increasing Triplet Subsequence
给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。 数学表达式如下: 如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1, 使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。
97 0
LeetCode 334. Increasing Triplet Subsequence
HDU 4632 Palindrome subsequence(动态规划)
HDU 4632 Palindrome subsequence(动态规划)
81 0
HDU 4632 Palindrome subsequence(动态规划)
AtCoder Beginner Contest 214 F - Substrings(subsequence DP)
AtCoder Beginner Contest 214 F - Substrings(subsequence DP)
102 0
【LeetCode】Increasing Triplet Subsequence(334)
  Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the array.
106 0
|
人工智能
POJ 2533 Longest Ordered Subsequence
POJ 2533 Longest Ordered Subsequence
117 0

热门文章

最新文章