贪心即可
对于一个方块。
如果比之前的方块边长小。
就可以塞到之前方块的下面
如果比之前的方块边长大。 就要靠在之前的所有方块上比一下。找最大的一个位置就是。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <map>
#include <sstream>
#include <queue>
#include <vector>
#define MAXN 100005
#define MAXM 211111
#define eps 1e-8
#define INF 500000001
using namespace std;
inline int dblcmp(double d)
{
if(fabs(d) < eps) return 0;
return d > eps ? 1 : -1;
}
int b[55], l[55], r[55], a[55];
int n;
vector<int> ans;
int main()
{
while(scanf("%d", &n) != EOF && n)
{
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
if(i == 0)
{
b[i] = a[i];
continue;
}
if(a[i] <= a[i - 1]) b[i] = b[i - 1] + 2 * a[i];
else
{
int mi = a[i];
for(int j = 0; j < i; j++)
{
if(a[j] <= a[i]) mi = max(mi, b[j] + 2 * a[j]);
else mi = max(mi, b[j] + 2 * a[i]);
}
b[i] = mi;
}
}
ans.clear();
for(int i = 0; i < n; i++) l[i] = b[i] - a[i], r[i] = b[i] + a[i];
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(a[j] > a[i])
{
if(j > i) r[i] = min(r[i], b[j] - a[j]);
else l[i] = max(l[i], b[j] + a[j]);
}
}
if(l[i] < r[i]) ans.push_back(i + 1);
}
for(int i = 0; i < ans.size() - 1; i++) printf("%d ", ans[i]);
printf("%d\n", ans[ans.size() - 1]);
}
return 0;
}