zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    ST表
    容斥原理
    扩展欧几里得算法
    C++ 快读快写模板
    单例模式的装饰器实现
    使用python+poco+夜神模拟器进行自动化测试
    使用Airtest超快速开发App爬虫
    mysql优化
    在浏览器中输入URL并回车后都发生了什么?
    第一次博客作业
  • 原文地址:https://www.cnblogs.com/pach/p/7217631.html
Copyright © 2011-2022 走看看