简单题,直接模拟就行。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <functional>
#include <algorithm>
using namespace std;
const int size = 10000 + 50;
int v[size];
int r[2*size + 1];
void f(int * x , int * y , int now)
{
if(x >= y || *x == -1) return;
r[now] += *x;
int *t = x + 1;
int p = 1 , q = 0;
while(p > q)
{
if(*t == -1) ++q;
else ++p;
++t;
}
if((t-1) != (x+1)) f(x + 1 , t , now-1);
if(t != y) f(t , y , now + 1);
}
int main()
{
int cnt = 1;
while(1)
{
int i = 0;
int p = 1 , q = 0;
while(p > q)
{
cin >> v[i];
if(v[i] < 0) ++q;
else ++p;
++i;
}
memset(r , 0 , sizeof(r));
f(v , v + i , size);
auto iter = find_if(r , r + 2 * size + 1 , bind2nd(greater<int>() , 0));
if(iter == (r + 2 * size + 1)) break;
cout << "Case " << cnt++ << ":" << endl;
cout << *iter;
while(*++iter)
cout << " " << *iter;
cout << endl << endl;
}
return 0;
}