思路:
动态规划。
首先处理出这些数的前缀和$a$,$f_i$记录从第$1$位到第$i$位的最大分组数量。DP方程为:
$f_i=max(f_i,f_j+1)$,其中$j$满足$a_i-a_j≥0$。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 int main() { 5 int n; 6 scanf("%d",&n); 7 int a[n+1]; 8 a[0]=0; 9 int f[n+1]; 10 memset(f,0,sizeof f); 11 for(int i=1;i<=n;i++) { 12 scanf("%d",&a[i]); 13 a[i]+=a[i-1]; 14 if(a[i]<0) continue; 15 for(int j=0;j<i;j++) { 16 if(a[i]-a[j]>=0) { 17 f[i]=std::max(f[i],f[j]+1); 18 } 19 } 20 } 21 printf(f[n]?"%d ":"Impossible ",f[n]); 22 return 0; 23 }