题目链接:https://vjudge.net/problem/POJ-3347
题意:摆放n个正方形,问俯视视角来看时哪些正方形可见。
思路:在刷计算几何专题时刷到这题,但不需要用计算几何的知识。我们首先将数据扩大√2 倍,即将输入的边当作正方形中心到顶点的距离,这样就可以避免浮点数运算。首先得到每个正方形的左右端点的x坐标,然后计算每个正方形俯视角度下的左右端点的x坐标,当右端点大于左端点时表示1可见。
AC code:
#include<cstdio> #include<algorithm> #include<cmath> #include<cstdlib> using namespace std; const int maxn=55; int n; struct node{ int l,r,len; }sq[maxn]; int main(){ while(scanf("%d",&n),n){ for(int i=1;i<=n;++i){ sq[i].l=0; scanf("%d",&sq[i].len); for(int j=1;j<i;++j) sq[i].l=max(sq[i].l,sq[j].r-abs(sq[i].len-sq[j].len)); sq[i].r=sq[i].l+2*sq[i].len; } for(int i=1;i<=n;++i){ for(int j=1;j<i;++j) if(sq[j].len>sq[i].len&&sq[j].r>sq[i].l) sq[i].l=sq[j].r; for(int j=i+1;j<=n;++j) if(sq[j].len>sq[i].len&&sq[j].l<sq[i].r) sq[i].r=sq[j].l; } int first=1; for(int i=1;i<=n;++i){ if(sq[i].l>=sq[i].r) continue; if(first) first=0; else printf(" "); printf("%d",i); } printf(" "); } return 0; }