[poj3347]Kadj Squares

题目大意:斜45度摆放的正方形,靠左摆放,但需与x轴接触,求按顺序摆放,从上方可以观察到的正方形序号。

解题关键:因为题目没让输出与边长有关的东西,所以可以直接将边长设为左端点到中心的距离,来消除误差。求出每个正方形的左端点和右端点之后,然后dp一下求出每个正方形最左端可以被看到的位置和最右端可以被看到的位置。判断一下即可出答案。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<iostream>
using namespace std;
typedef long long ll;
struct Segment{
    int left,right,len;
}seg[50];
//此题只看的顺序,所以把边长看成左端点到中心的距离,避免精度问题
int main(){
    int n;
    while(cin>>n,n){
        for(int i=0;i<n;i++){
            cin>>seg[i].len;
            seg[i].left=0;
            for(int j=0;j<i;j++){
                seg[i].left=max(seg[i].left,seg[j].right-abs(seg[i].len-seg[j].len));
            }
            seg[i].right=seg[i].left+seg[i].len*2;
        }
        //求线段交
        for(int i=1;i<n;i++){
            for(int j=0;j<i;j++){
                if(seg[i].len>seg[j].len&&seg[i].left<seg[j].right)
                    seg[j].right=seg[i].left;
                else if(seg[i].len<seg[j].len&&seg[i].left<seg[j].right)
                    seg[i].left=seg[j].right;
            }
        }
        for(int i=0;i<n;i++){
            if(seg[i].left<seg[i].right)
                cout<<i+1<< " ";
        }
        cout<<"\n";
    }
    return 0;
}

原文地址:https://www.cnblogs.com/elpsycongroo/p/8734590.html

时间: 2024-09-30 04:00:20

[poj3347]Kadj Squares的相关文章

poj3347 Kadj Squares (计算几何)

D - Kadj Squares Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description In this problem, you are given a sequence S1, S2, ..., Sn of squares of different sizes. The sides of the squares are integer numb

POJ3347 Kadj Squares(计算几何&amp;区间覆盖)

题目链接: http://poj.org/problem?id=3347 题目描述: Kadj Squares Description In this problem, you are given a sequence S1, S2, ..., Sn of squares of different sizes. The sides of the squares are integer numbers. We locate the squares on the positive x-y quart

POJ 3347 Kadj Squares(计算几何)

传送门 Kadj Squares Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 2937 Accepted: 1151 Description In this problem, you are given a sequence S1, S2, -, Sn of squares of different sizes. The sides of the squares are integer numbers. We locate

简单几何(线段覆盖) POJ 3347 Kadj Squares

题目传送门 题意:告诉每个矩形的边长,它们是紧贴着的,问从上往下看,有几个还能看到. 分析:用网上猥琐的方法,将边长看成左端点到中心的距离,这样可以避免精度问题.然后先求出每个矩形的左右端点,然后如果被覆盖那么将端点更新到被覆盖的位置.最后看那些更新后左端点小于右端点,这些是可以看得到的. /************************************************ * Author :Running_Time * Created Time :2015/10/28 星期三

POJ 3347 Kadj Squares (计算几何+线段相交)

题意:从左至右给你n个正方形的边长,接着这些正方形都按照旋转45度以一角为底放置坐标轴上,最左边的正方形左端点抵住y轴,后面的正方形依次紧贴前面所有正方形放置,问从上方向下看去,有哪些正方形是可以被看到的(如图) 题解:首先我们找到每个正方形左右端点的坐标转化为一条线段,接着我们寻找哪些线段被其他某些条线段覆盖,这些被覆盖的线段就不能被看到 寻找被覆盖的线段利用区贪心间,我们按照左端点升序.左端点相同右端点降序排序,则左端点一定被前面的线段覆盖,接着对于右端点使用单调栈的思想寻找可以看到的线段就

POJ 3347 Kadj Squares (线段覆盖)

题目大意:给你几个正方形的边长,正方一个顶点在x轴上然后边与x轴的夹角为45度,每个正方形都是紧贴的,问从上面看能看的正方形的编号 题目思路:线段覆盖,边长乘上2防止产生小数,求出每个正方形与x轴平行的对角线的起始x坐标,剩下的就是线段了. #include<cstdio> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<cs

POJ 3347 Kadj Squares

题意: 题目链接 思路: 最开始没思路不知道怎么判断 后来看了题解... 果然数据小(n<=50,len<=30)就可以随便瞎搞 开始时困扰我的是怎么求新加入的正方形的位置 原来是枚举已加入的每一个正方形,计算出紧挨当前正方形的位置,然后取max就可以了 至于正方形是否看得见 两两枚举判断(见代码) code:(这道题其实看代码超级好理解) #include<cstdio> #include<cmath> #include<algorithm> #inclu

【转】计算几何题目推荐

打算转下来好好做计算几何了. 原文地址:http://blog.sina.com.cn/s/blog_49c5866c0100f3om.html 其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板很重要,模板必须高度可靠.3.要注意代码的组织,因为计算几何的题目很容易上两百行

Kuangbin 带你飞-基础计算几何专题 题解

专题基本全都是模版应用.贴一下模版 const double eps = 1e-8; const int INF = 0x3f3f3f3f; int sgn(double x) { if (fabs(x) < eps) return 0; if (x < 0) return -1; return 1; } struct Point { double x,y; Point(){} Point(double tx,double ty) { x = tx; y = ty; } Point opera