列表

详情


NC26251. 小阳买水果

描述

水果店里有 个水果排成一列。店长要求顾客只能买一段连续的水果。
小阳对每个水果都有一个喜爱程度 ,最终的满意度为他买到的水果的喜欢程度之和。
如果和为正(不管是正多少,只要大于 即可),他就满意了。
小阳想知道在他满意的条件下最多能买多少个水果。
你能帮帮他吗?

输入描述

第一行输入一个正整数 n,表示水果总数。

第二行输入 n 个整数 ,表示小阳对每个水果的喜爱程度。

输出描述

一行一个整数表示结果。(如果 1 个水果都买不了,请输出 0)

示例1

输入:

5
0 0 -7 -6 1

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 357ms, 内存消耗: 8260K, 提交时间: 2021-10-31 18:53:04

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a[2000001],n,sum=0,ans=-0x3f3f3f3f,t;
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&t);
		sum+=t;
		a[i]=min(a[i-1],sum);
		int l=0,r=i-1,mid;
		while(l<=r)
		{
			mid=(l+r)>>1;
			if(a[mid]<sum) r=mid-1;
			else l=mid+1;
		}
		if(r!=-2) ans=max(ans,i-r-1);
	} 
	printf("%d\n",ans);
}

C++14(g++5.4) 解法, 执行用时: 368ms, 内存消耗: 8300K, 提交时间: 2019-07-13 09:05:39

#include<bits/stdc++.h>
using namespace std;
int a[2000061],s,x,ans;
int main(){
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		s+=x;
		a[i]=min(a[i-1],s);
		int l=0,r=i-1,k=-1;
		while(l<=r){
			int mid=(l+r)>>1;
			if(a[mid]<s){
				r=mid-1;
			}else l=mid+1;
		}
		if(r!=-2){
			ans=max(ans,i-r-1);
		}
	}
	cout<<ans<<endl;
}

上一题