求出正方形的左右端点,再判断是否覆盖
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define eps 1e-8
#define INF 1e9
using namespace std; const int maxn=55; struct Square
{
double l,r,len;
}sqr[maxn]; int sgn(double x)
{
if(fabs(x)<eps) return 0;
return x<0? -1:1;
} int main()
{
// freopen("in.txt","r",stdin);
int n;
while(scanf("%d",&n),n)
{
for(int i=0;i<n;i++)
{
scanf("%lf",&sqr[i].len);
sqr[i].l=0;
for(int j=0;j<i;j++)
sqr[i].l=max(sqr[i].l,sqr[j].r-fabs(sqr[i].len-sqr[j].len)/sqrt(2.0));
sqr[i].r=sqr[i].l+sqr[i].len*sqrt(2.0);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<i;j++)
{
if(sqr[i].len>sqr[j].len && sqr[i].l<sqr[j].r)
sqr[j].r=sqr[i].l; //sqr[i]的左侧覆盖了sqr[j]的右侧,把sqr[j]的右侧删去
if(sqr[i].len<sqr[j].len && sqr[i].l<sqr[j].r)
sqr[i].l=sqr[j].r; //sqr[i]的左侧被sqr[j]的右侧覆盖,把sqr[j]的左侧删去
}
}
bool flag=true;
for(int i=0;i<n;i++)
{
if(sgn(sqr[i].r-sqr[i].l)>0)
{
if(flag) printf("%d",i+1);
else printf(" %d",i+1);
flag=false;
}
}
puts("");
}
return 0;
}