蒟蒻站外题求调(玄关)
  • 板块灌水区
  • 楼主linzichen120207
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/16 12:21
  • 上次更新2023/12/16 14:15:57
查看原帖
蒟蒻站外题求调(玄关)
935855
linzichen120207楼主2023/12/16 12:21

【问题描述】

给定一个含有 n 个正整数的数组和一个正整数value,找出该数组中满足其和 s ≥ value 的长度最小的连续子数组 {nums[i], nums[i+1], ..., nums[i+r]} ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

【输入格式】

输入两行,第一行两个整数,分别表示个数n和目标数value;

第二行为n个数组元素,每个数之间用空格隔开。

【输出格式】

输出一行,一个整数,表示符合条件的值。

【输入样例 1】

6 7

2 3 1 2 4 3

【输出样例1】

2

解释:子数组 [4,3] 是该条件下的长度最小的子数组。

【输入样例 2】

3 4

1 4 4

【输出样例2】

1

【输入样例3】

8 11

1 1 1 1 1 1 1 1

【输出样例3】

0

蒟蒻代码
#include<bits/stdc++.h>
using namespace std;
int n,a[100005];
long long s[100005];
long long value,ans;

void search(int l,int r){
	while(l<=r){
		int mid=(l+r)/2;
		bool f=false;
		for(int i=1;i<=n-mid+1;i++){
			long long sum=s[i+mid-1]-s[i-1];
			if(sum>=value){
				f=true;
			}
		}
		if(f==true){
			ans=mid;
			r=mid-1;
		}else{
			l=mid+1;
		}
	}
}

int main(){
	cin>>n>>value;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		s[i]=s[i-1]+a[i];
	}
	if(value==1){
		cout<<1;
		exit(0);
	}
	if(s[n]<value){
		cout<<0;
		exit(0);
	}
	search(1,n);
	cout<<ans;
	return 0;
}
2023/12/16 12:21
加载中...