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;
}
原文地址:https://www.cnblogs.com/pach/p/7217631.html