• POJ 3347 Kadj Squares (计算几何)


    题目:

    Description

    In this problem, you are given a sequence S1S2, ..., Sn of squares of different sizes. The sides of the squares are integer numbers. We locate the squares on the positive x-y quarter of the plane, such that their sides make 45 degrees with x and y axes, and one of their vertices are on y=0 line. Let bi be the x coordinates of the bottom vertex of Si. First, put S1 such that its left vertex lies on x=0. Then, put S1, (i > 1) at minimum bi such that

    • bi > bi-1 and
    • the interior of Si does not have intersection with the interior of S1...Si-1.

     

     

    The goal is to find which squares are visible, either entirely or partially, when viewed from above. In the example above, the squares S1S2, and S4 have this property. More formally, Si is visible from above if it contains a point p, such that no square other than Si intersect the vertical half-line drawn from p upwards.

    Input

    The input consists of multiple test cases. The first line of each test case is n (1 ≤ n ≤ 50), the number of squares. The second line contains n integers between 1 to 30, where the ith number is the length of the sides of Si. The input is terminated by a line containing a zero number.

    Output

    For each test case, output a single line containing the index of the visible squares in the input sequence, in ascending order, separated by blank characters.

    Sample Input

    4
    3 5 1 4
    3
    2 1 2
    0
    

    Sample Output

    1 2 4
    1 3

    题意:依次给出n个正方形的边长 每个正方形在x轴上呈45°摆放并且尽可能放的紧凑 问从上方看时能看见哪些正方形
    思路:对于第i个正方形 判断前i-1个正方形如果和它相交的话左端点的位置 最后取一个最大值作为整个正方形的左端点位置
       对于j<i的正方形 如果i的边长大于j 那么j的最右能看到的部分就不会比i的最左端点大 反之 i的最左能看到的部分就不会比j最右端点小
       再将最左能看到的端点比最右能看到的端点去掉
       为了避免浮点数 将每条边乘上sqrt(2)然后约掉 效果等于将正方形投影到x轴上

    代码:
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <string>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const int inf=0x3f3f3f3f;
    const int maxn=110;
    int n;
    
    struct node{
        int l,r,len;
    }kk[maxn];
    
    int main(){
        while(~scanf("%d",&n)){
            if(n==0) break;
            for(int i=1;i<=n;i++){
                scanf("%d",&kk[i].len);
                kk[i].l=0;
                for(int j=1;j<i;j++){
                    kk[i].l=max(kk[i].l,kk[j].r-abs(kk[i].len-kk[j].len));
                }          
                kk[i].r=kk[i].l+2*kk[i].len;
            }
            for(int i=1;i<=n;i++){
                for(int j=1;j<i;j++){
                    if(kk[i].l<kk[j].r && kk[i].len<kk[j].len)
                        kk[i].l=kk[j].r;
                }
                for(int j=i+1;j<=n;j++){
                    if(kk[i].r>kk[j].l && kk[i].len<kk[j].len)
                        kk[i].r=kk[j].l;
                }
            }
            int flag=1;
            for(int i=1;i<=n;i++){
                if(kk[i].l<kk[i].r){
                    if(flag) flag=0;
                    else printf(" ");
                    printf("%d",i);
                }
            }
            printf("
    ");
        }
        return 0;
    }
    
    
    
     
  • 相关阅读:
    Windows核心编程笔记:同步设备I/O与异步设备I/O 200404
    最顶层窗口
    Windows环境变量
    如何使用Beyond Compare比较两个文件夹的差异
    c++生成缩略图
    MD5加密算法
    c++读写注册表
    通过WMI获取网卡MAC地址、硬盘序列号、主板序列号、CPU ID、BIOS序列号
    Hive中HSQL中left semi join和INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN区别
    postgreSQL格式化时间的函数详解
  • 原文地址:https://www.cnblogs.com/whdsunny/p/9879367.html
Copyright © 2020-2023  润新知