POJ 3347 Kadj Squares 计算几何
求出正方形的左右端点,再判断是否覆盖
#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; }