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

题目传送门

题意:告诉每个矩形的边长,它们是紧贴着的,问从上往下看,有几个还能看到。

分析:用网上猥琐的方法,将边长看成左端点到中心的距离,这样可以避免精度问题。然后先求出每个矩形的左右端点,然后如果被覆盖那么将端点更新到被覆盖的位置。最后看那些更新后左端点小于右端点,这些是可以看得到的。

/************************************************
* Author        :Running_Time
* Created Time  :2015/10/28 星期三 11:48:32
* File Name     :POJ_3347.cpp
 ************************************************/

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double EPS = 1e-10;
const double PI = acos (-1.0);
struct Square    {
    int l, r, len;
}s[55];

int main(void)    {
    int n;
    while (scanf ("%d", &n) == 1)   {
        if (!n) break;
        for (int i=1; i<=n; ++i)    {
            scanf ("%d", &s[i].len);
            s[i].l = 0;
            for (int j=1; j<i; ++j) {
                int tmp;
                if (s[i].len <= s[j].len)    {
                    tmp = s[j].l + s[j].len + s[i].len;
                }
                else    {
                    tmp = s[j].l + s[j].len * 3 - s[i].len;
                }
                if (tmp > s[i].l)   s[i].l = tmp;
            }
            s[i].r = s[i].l + s[i].len * 2;
        }
        for (int i=2; i<=n; ++i)    {
            for (int j=1; j<i; ++j) {
                if (s[j].len < s[i].len && s[j].r > s[i].l) {
                    s[j].r = s[i].l;
                }
                else if (s[j].len > s[i].len && s[j].r > s[i].l)    {
                    s[i].l = s[j].r;
                }
            }
        }
        for (int i=1; i<=n; ++i)    {
            if (s[i].l < s[i].r)    {
                printf ("%d ", i);
            }
        }
        puts ("");
    }

   //cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";

    return 0;
}

  

时间: 2024-10-12 02:58:23

简单几何(线段覆盖) POJ 3347 Kadj Squares的相关文章

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

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 2653 Pick-up sticks

题目传送门 题意:就是小时候玩的一种游戏,问有多少线段盖在最上面 分析:简单线段相交,队列维护当前最上的线段 /************************************************ * Author :Running_Time * Created Time :2015/10/26 星期一 15:37:36 * File Name :POJ_2653.cpp ************************************************/ #inclu

简单几何(线段相交) POJ 2826 An Easy Problem?!

题目传送门 题意:两条线段看成两块木板,雨水从上方往下垂直落下,问能接受到的水的体积 分析:恶心的分类讨论题,考虑各种情况,尤其是入口被堵住的情况,我的方法是先判断最高的两个点是否在交点的同一侧,然后看看是否高的点覆盖了低的点,用叉积判断方向,其他的情况见网上的解释.貌似没有什么卡精度的数据.最后膜拜楼教主,难以望其项背... /************************************************ * Author :Running_Time * Created Ti

简单几何(线段相交) POJ 1410 Intersection

题目传送门 题意:一个矩形和一条线段,问是否有相交 分析:考虑各种情况.坑点:给出的矩形的两个端点是无序的,还有线段完全在矩形内也算相交 /************************************************ * Author :Running_Time * Created Time :2015/10/27 星期二 13:17:49 * File Name :POJ_1410.cpp ******************************************

简单几何(线段相交) POJ 1066 Treasure Hunt

题目传送门 题意:从四面任意点出发,有若干障碍门,问最少要轰掉几扇门才能到达终点 分析:枚举入口点,也就是线段的两个端点,然后选取与其他线段相交点数最少的 + 1就是答案.特判一下n == 0的时候 /************************************************ * Author :Running_Time * Created Time :2015/10/26 星期一 16:30:26 * File Name :POJ_1066.cpp ***********

POJ 3347 Kadj Squares

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

简单几何(线段相交+最短路) POJ 1556 The Doors

题目传送门 题意:从(0, 5)走到(10, 5),中间有一些门,走的路是直线,问最短的距离 分析:关键是建图,可以保存所有的点,两点连通的条件是线段和中间的线段都不相交,建立有向图,然后用Dijkstra跑最短路.好题! /************************************************ * Author :Running_Time * Created Time :2015/10/24 星期六 09:48:49 * File Name :POJ_1556.cpp