每个方形45度放置,贴边放置,尽可能减省空间,问最后从上往下看能看到哪几个方形。
定义结构体,记录方形的边长,左顶点位置和右顶点位置,因为有覆盖,所以更新左右顶点位置,再判断即可。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=55;
struct square{
int lp; //左位置
int rp; //右位置
int len; //边长
}p[N];
int ans[N],n;
void work(){
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++) //覆盖方形左侧,更新左位置,如3
if(p[i].lp<p[j].rp&&p[i].len<p[j].len)
p[i].lp=p[j].rp;
for(int j=i+1;j<=n;j++) //覆盖方形右侧,更新右位置,如1
if(p[i].rp>p[j].lp&&p[j].len>p[i].len)
p[i].rp=p[j].lp;
}
int cnt=0;
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++)
if(p[i].lp<p[i].rp)
ans[cnt++]=i;
for(int i=0;i<cnt;i++)
printf("%d%c",ans[i],i==cnt-1?'\n':' ');
}
int main(){
while(~scanf("%d",&n),n){
for(int i=1;i<=n;i++){
scanf("%d",&p[i].len);
p[i].lp=0;
for(int j=1;j<i;j++) //更新左位置
p[i].lp=max(p[i].lp,p[j].rp-abs(p[i].len-p[j].len));
p[i].rp=p[i].lp+2*p[i].len; //因为45度放置,都乘以sqrt(2)便于计算
}
work();
}
return 0;
}