HNUCM-OJ Problem 1614 幸运数 模拟 最短子段和

题目描述

众所周知,不管是人还是熊都需要人品。于是乎,为了给自己找一个幸运数字,Mavis 学习了人类的阿拉伯数字,并不知从哪儿弄来了一串序列和一个 S,Mavis 说:“长度最短且和大于等于 S 的连续子段的长度, 就是俺的幸运数字”!

但是 Mavis 只会喊口号,不会解决问题,所以这个问题就交给你了。

输入
输入文件共三行。

第一行输入仅一个正整数 n,意义如题所述。( n ≤ 4000000, ai ≤ 10^9)

第二行输入 n 个正整数 ai,表示序列中的元素。

第三行输入仅一个正整数 S,意义如题所述。

每两个输入的数之间都用一个空格隔开。

输出
输出文件仅一行一个整数,表示幸运数。

样例输入
8
4 12 10 18 17 10 17 17
40

样例输出
3

思路

题目求大于或者等于S的最短子段和,输出最短长度,模拟即可,遍历找出大于或者等于S的区间,然后求出最短区间即可。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e6+5;
ll a[maxn],n,sum;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    cin>>sum;
    ll res=0,cc=maxn;
    ll s=1,k=1;
    while(k<=n){
        while(res<sum) res+=a[k++];
        while(res>=sum){
            cc=min(cc,k-s);
            res-=a[s++];
        }
    }
    cout<<cc<<endl;
    return 0;
}
学如逆水行舟,不进则退
发布了591 篇原创文章 · 获赞 1743 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/weixin_42429718/article/details/105032571