Content
有 \(n\) 个数,要分成若干堆,要求每堆中的负数最多只能有两个。试求出分成的堆数最少是多少,并求出每一堆里面的数的个数。
数据范围:\(1\leqslant n\leqslant 100,|a_i|\leqslant100\)。
Solution
这题目不算太难,我的想法是这样的:一个一个判断是不是负数,如果出现了 \(3\) 个负数,那么就把前面的所有数全部划进一堆,就可以保证堆数最少了。
Code
#include <cstdio>
using namespace std;
int n, a[107], s[107], neg;
int main() {
scanf("%d", &n);
s[0] = 1;
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
if(a[i] < 0) neg++;
if(neg > 2) {
++s[0];
neg -= 2;
}
s[s[0]]++;
}
printf("%d\n", s[0]);
for(int i = 1; i <= s[0]; ++i) printf("%d ", s[i]);
}