题目讲的是给一组数据,X得到的所有数据之和,Y得到的是一个区间的总和,但这个区间不能是[1,n];要求如果X大于Y就输出YES 反之 NO
这种题目如果不想麻烦就从[1,n-1]和[2,n]求最大值。
求连续区间最大值的方法就是建一个新的数组,下标i代表这以i为结尾的连续区间的最大值。
则 maxn[i]=max(0,maxn[i-1]+a[i]);即可。
以下为代码
#include<iostream> #include<queue> #include<string> #include<cstring> #include<map> #include<algorithm> #include<cmath> using namespace std; long long a[100200]; long long maxn[100200]; int main(){ int t; cin>>t; while(t--){ int n; cin>>n; long long tot=0; memset(a,0,sizeof(a)); memset(maxn,0,sizeof maxn); long long mannn=-99999999; for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); tot+=a[i]; } for(int i=1;i<=n-1;i++){ maxn[i] = max((long long)0,maxn[i-1] + a[i]); if(maxn[i]>mannn) mannn=maxn[i]; } memset(maxn,0,sizeof maxn); for(int i=2;i<=n;i++){ maxn[i] = max((long long)0,maxn[i-1] + a[i]); if(maxn[i]>mannn) mannn=maxn[i]; } if(mannn>=tot)cout<<"NO"<<endl; else cout<<"YES"<<endl; } return 0; }
这样就能过了,但是这道题真的需要这么做嘛?
有没有想过,当maxn[i]如果为0的时候就已经代表要输出no了。
因此
#include<iostream> #include<queue> #include<string> #include<cstring> #include<map> #include<algorithm> #include<cmath> using namespace std; long long a[100200]; long long maxn[100200]; int main(){ int t; cin>>t; while(t--){ int n; cin>>n; long long l,r; l=r=0; memset(a,0,sizeof(a));for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); } int f=0; for(int i=1;i<=n;i++){ l+=a[i]; r+=a[n-i+1]; if(l<=0||r<=0){//代表有个连续区间的和为非正数 f=1; } } if(f==1)puts("NO"); else puts("YES"); } return 0; }