这个当时我没有做出来,看了很多人包括学长的代码才懂,我感觉最好的方法还是下面那一种,标记以谁开头的是不行的,我感觉有点不好理解,如果不懂举组样例在纸上写一下就会比较清楚了
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define LL long long LL a[500001]; bool flag[500001]; int main() { int t,n,i,total,id=1; LL sum; scanf("%d",&t); while(t--) { scanf("%d",&n); memset(flag,0,sizeof(flag)); total=n; for(i=0;i<n;i++) scanf("%I64d",&a[i]); sum=a[n-1]; if(sum<=0) { total--; flag[n-1]=1; } for(i=n-2;i>=0;i--) { if(sum<=0) { sum+=a[i]; if(sum<=0) { total--; flag[i]=1; } } else { if(a[i]<=0) { sum=a[i]; total--; flag[i]=1; } } } if(sum<=0) { for(i=n-1;i>=0;i--) { sum+=a[i]; if(sum<=0 && flag[i]==0) total--; if(sum>0) break; } } printf("Case %d: %d ",id++,total); } return 0; }