题目描述
小刚家的 n 只兔子聚集在一起,排成一列,正在进行一项抗议活动。第 i 只兔子的理智度为 ai。小刚希望兔子在抗议时保持理性,为此,他打算将所有的兔子隔离成若干个小组,每个小组内的兔子的理智度总和都要不小于零。由于兔子是按直线排列的,所以一个小组内的兔子位置必须是连续的。请帮助小刚计算一下,最多分成几组。
输入格式
第一行一个正整数 n,表示兔子的数目。
接下来 n 行,每行一个整数,表示每个兔子的理智度。
输出格式
若存在合法分组方案,输出一行一个整数表示答案;否则输出 Impossible。
样例输入 #1
4
2
3
-3
1
样例输出 #1
3
提示
【数据规模和约定】
对于 30% 的数据,1≤n≤20;
对于 100% 的数据,1≤n≤1000,|ai|≤105。
#include<bits/stdc++.h>
using namespace std;
int n, b[100100], f[100100], a[100100],lizhizhi=0;
bool qxh(int o,int m){
int ans=0;
for(int i=o;i<=m;i++){
ans+=b[i];
}
if(ans>=0) return 1;
else return 0;
}
int main() {
cin >> n;
a[0] = 0;
for (int i = 1; i <= n; i++) {
cin >> b[i];
f[i] = -1;
a[i] = a[i - 1] + b[i];
lizhizhi+=b[i];
}
if (lizhizhi < 0) {
cout << "Impossible";
return 0;
}
f[0] = 0; // -1 表示暂无分组解法
for (int i = 1; i <= n; i++) {
for (int j = 0; j < i; j++) {
if (qxh(j+1,i) && f[j] != -1 ) {
f[i] = max(f[j] + 1, f[i]);
}
}
}
cout << f[n];
}