Subsequence(暴力+二分)

Subsequence

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 10875   Accepted: 4493

Description

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

The first line is the number of test cases. 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 no answer, print 0.

Sample Input

2
10 15
5 1 3 5 10 7 4 9 2 8
5 11
1 2 3 4 5

Sample Output

2
3题解:让求连续的一个序列数之和大于等于S的最短序列长度;这道题,我前后换了三种方法才A了,刚开始看到,一想不就是个线段树,写完了发现答案不对。。。然后发现线段树只能找到一半,还呆加上区间合并,区间合并也很可能不对,然后想着树状数组,写了一半感觉还不如用个数组直接存到i的总值和,然后找到起点终点就好了,于是开始了暴力,暴力肯定超时啊;就想着二分下;调试了下就过了;二分还要判断下当前点与前一个点插哪个;可能我写的太麻烦了。。。有空看看大神怎么写的;AC代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
#define P_ printf(" ")
#define ll root<<1
#define rr root<<1|1
#define lson ll,l,mid
#define rson rr,mid+1,r
const int INF=0x3f3f3f3f;
const int MAXN=100010;
int tree[MAXN];

int main(){
    int T,N,M;
    SI(T);
    while(T--){
        SI(N);SI(M);
        mem(tree,0);
        int ans=INF;
        int t=1;
        for(int i=0;i<N;i++){
            int x;
            SI(x);
            if(!i)tree[i]=x;
            else tree[i]=tree[i-1]+x;
        }
        for(int i=N-1;i>=0;i--){
            if(tree[i]-M>=0){
                int t=lower_bound(tree,tree+i,tree[i]-M)-tree;
                if(tree[i]-tree[t]>=M)ans=min(ans,i-t);
                else ans=min(ans,i-t+1);
                //printf("%d\n",ans);
            }
        }
        if(ans==INF)puts("0");
        else printf("%d\n",ans);
    }
    return 0;
} 
时间: 2024-11-10 00:53:53

Subsequence(暴力+二分)的相关文章

poj3977 - subset - the second time - 暴力 + 二分

2017-08-26 11:38:42 writer:pprp 已经是第二次写这个题了,但是还是出了很多毛病 先给出AC代码: 解题思路: 之前在培训的时候只是笼统的讲了讲怎么做,进行二分对其中一边进行暴力枚举,对另一边用lower_bound查找算出的相反数 现在给出详细一点的思路: 答案可能在左边枚举的部分,也可能在右边枚举的部分,也可能在两边加起来的和中 所以从这三个方面不能少考虑: 还有用到了map所以算出来的key是唯一的,所以当算出来两个key相等的时候,应该采用value也就是cn

[51nod] 1267 4个数和为0 暴力+二分

给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No". Input 第1行,1个数N,N为数组的长度(4 <= N <= 1000) 第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9) Output 如果可以选出4个数,使得他们的和为0,则输出"Yes",否则输出"No". Input示例 5 -1 1 -5 2 4 Output

Vijos P1116 一元三次方程求解【多解,暴力,二分】

一元三次方程求解 描述 有形如:ax^3+bx^2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1.要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位. 格式 输入格式 输入该方程中各项的系数(a,b,c,d 均为实数), 输出格式 由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位. 样例1 样例输入1

ACM学习历程—Hihocoder 1288 Font Size(暴力 || 二分)

http://hihocoder.com/problemset/problem/1288 这题是这次微软笔试的第一题,关键的是s的上限是min(w, h),这样s的范围只有到1000,这样就可以直接暴力了,当然用二分也行,不过暴力写起来更快一点. 代码: #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #inc

POJ 3061 Subsequence (二分||尺取法)

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 sequen

UVA10487 Closest Sums【暴力+二分】

Given is a set of integers and then a sequence of queries. A query gives you a number and asks to find a sum of two distinct numbers from the set, which is closest to the query number. Input Input contains multiple cases. ????Each case starts with an

LA 2678 Subsequence(二分查找)

题目链接: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

[POJ3061]Subsequence(二分,前缀和)

题目链接:http://poj.org/problem?id=3061 题意:给一个长为n的数列和整数s,求一个连续的子序列,使得这个子序列长度最短并且不小于这个整数s. 统计[1~i]的子序列和sum(i),(sum(0)=0).然后求一个区间[i,j]的和即为sum(j)-sum(i-1) (i > 0). 由于给定序列没有负数,因此sum是个严格不减的序列. 转换成一个求最大值最小的问题,可以二分枚举序列长度,在前缀和上计算子序列[i-1,i+m-1]的和.如果存在一个满足子序列和≥s的,

寒假 9(max subsequence sum二分递归算法实现并debug,表的链表实现概念过程整理)

二分递归实现过程收获: 一个取max的函数,核心是我brute的排序函数: 递归啊,如果结果出错,检查的时候查具体步骤,递归这个指令没什么好检查的: 遍布每个得出结果的关键点的输出测试: 因为一开始把right设成了array length,后面出现了str[length],有随机错误: 声明为int的小数,编译器直接不足近似处理为整数. 某处加一个break point,左边就可以看运行信息 表的链表实现概念梳理: 用链表实现的表,没有固定的位置编号,仅可以从value上识别,寻找,一个ele