Subsequence

Subsequence

https://ac.nowcoder.com/acm/problem/107658

尺取法

Subsequence

题意:

给你长度为n的序列,找一个连续子序列的和大于等于s,问该子序列的长度最短为多少

思路:

尺取法

用两个变量来代替尺子的两端,我用i代替左端,j代替右端

最开始序列和sum小于s,就让sum加上tr[j],并让j++

当sum-tr[i]大于等于s时,说明序列删一个元素,得到的子序列还满足大于等于s,就更新最小值,进行循环

#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <stdlib.h>
#include <sstream>
#include <map>
#include <set>
using  namespace std;
#define inf 0x3f3f3f3f
#define MAX 150000 + 5
typedef  long long ll ;

inline int IntRead(){
    char ch = getchar();int s = 0, w = 1;
    while(ch < '0' || ch > '9'){
        if(ch == '-') w = -1;
        ch = getchar();}
    while(ch >= '0' && ch <= '9'){
        s = s * 10 + ch - '0';ch = getchar();}
    return s * w;
}
int tr[MAX];
int main()
{
    int n, t, s;
    cin>>t;
    while (t--) {
        cin>>n>>s;
        for(int i = 1; i <= n; ++i){
            cin>>tr[i];
        }
        int  i = 1, sum = 0, minx = 1e9;
        for(int j = 1; j <= n; ++j){
            sum += tr[j];
            while (sum - tr[i] >= s) {
                sum -= tr[i];
                i++;
                minx = min(minx, j - i + 1);
            }
        }
        if(minx == 1e9)//如果没有能让sum大于s的,则minx就不会更新,输出0即可
            cout<<0<<endl;
        else
            cout<<minx<<endl;
    }
    return 0;
}
全部评论

相关推荐

01-04 21:30
已编辑
河南工业大学 Java
27届学院本誓死冲击...:下次再发把个人信息隐藏掉,以防有心之人。相关课程删了,荣誉奖项只留蓝桥杯,把蓝桥杯写到教育经历里,按教育经历、实习经历、项目经历、专业技能这个顺序排版
点赞 评论 收藏
分享
2025-12-14 11:43
黑龙江大学 Java
用微笑面对困难:确实比较烂,可以这么修改:加上大学的qs排名,然后大学简介要写一些,然后硕士大学加大加粗,科研经历第一句话都写上在复旦大学时,主要负责xxxx,简历左上角把学校logo写上,建议用复旦大学的简历模板
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务