UVa 221 (STL 离散化) Urban Elevations

题意:

作图为n个建筑物的俯视图,右图为从南向北看的正视图,按从左往右的顺序输出可见建筑物的标号。

分析:

题中已经说了,要么x相同,要么x相差足够大,不会出现精度问题。

给这n个建筑物从左往右排序,每个建筑物的两个端点,排序去重以后可以得到m个相邻的小区间。枚举这些区间,判断建筑物是否可见。

离散化刚开始接触这个词,感觉十分高冷。现在来看倒是很形象,因为是浮点数,所以不可能枚举所有的横坐标,但可以分割成若干的小区间,这个进行判断。即:将无限变为有限。

再说一下unique函数,调用之前必须先排序,而且调用后并不是将重复元素删除,而是将其挪到后面去。

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 const int maxn = 100 + 5;
 6
 7 struct Buiding
 8 {
 9     int id;
10     double x, y, w, d, h;
11     bool operator < (const Buiding& rhs) const
12     { return x < rhs.x || (x == rhs.x && y < rhs.y); }
13 }b[maxn];
14
15 int n;
16 double x[maxn * 2];
17
18 bool isCover(int i, double posx)
19 {
20     return b[i].x <= posx && b[i].x + b[i].w >= posx;
21 }
22
23 bool isVisibal(int i, double posx) //第i个建筑物是否在该横坐标处可见
24 {
25     if(!isCover(i, posx)) return false;
26     for(int k = 0; k < n; ++k)
27         if(isCover(k, posx) && b[k].y < b[i].y && b[k].h >= b[i].h)
28             return false;
29     return true;
30 }
31
32 int main()
33 {
34     //freopen("in.txt", "r", stdin);
35     int kase = 0;
36     while(scanf("%d", &n) == 1 && n)
37     {
38         for(int i = 0; i < n; ++i)
39         {
40             scanf("%lf%lf%lf%lf%lf", &b[i].x, &b[i].y, &b[i].w, &b[i].d, &b[i].h);
41             b[i].id = i + 1;
42             x[i*2] = b[i].x, x[i*2+1] = b[i].x + b[i].w;
43         }
44         sort(b, b + n);
45         sort(x, x + n * 2);
46         int m = unique(x, x + n*2) - x;
47
48         if(kase) puts("");
49         printf("For map #%d, the visible buildings are numbered as follows:\n%d", ++kase, b[0].id);
50         for(int i = 1; i < n; ++i)
51         {
52             bool flag = false;
53             for(int j = 0; j < m-1; ++j)
54             {
55                 double posx = (x[j] + x[j+1]) / 2;
56                 if(isVisibal(i, posx))
57                 {
58                     flag = true;
59                     break;
60                 }
61             }
62             if(flag) printf(" %d", b[i].id);
63         }
64         printf("\n");
65     }
66
67     return 0;
68 }

代码君

时间: 2024-10-21 19:34:32

UVa 221 (STL 离散化) Urban Elevations的相关文章

UVa 221 Urban Elevations 城市正视图 离散化初步 无限化有限

转载请注明: 仰望高端玩家的小清新 http://www.cnblogs.com/luruiyuan/ 题目大意: 题目传送门:UVa 221 Urban Elevations 给出城市中建筑物的x, y 坐标的最小值:x,y , 再给出其以左下角为坐标原点的关于x轴.y轴上的长度 w, 和 d,最后给出建筑物的高度 h,将建筑物的正视图中,能够看到的建筑物的id打印出来:要求先打印x小的,当x相同时,打印y小的.为了简化,假定建筑物都是长方体.同时,每个输出之间要用一个空行隔开 One bla

UVA - 221(区间覆盖)

 Urban Elevations  An elevation of a collection of buildings is an orthogonal projection of the buildings onto a vertical plane. An external elevation of a city would show the skyline and the faces of the ``visible" buildings of the city as viewed fr

I - Urban Elevations

uva 221 提供个房子的坐标以及房子宽度和高度,要求你求从南边看过去,可以看到的房子有哪些 PS:一定要注意题目的这句:One blank line must separate output from consecutive input records.不然会直接报错 可以直接使用暴力做,不过要注意枚举方式,在无序的情况下直接考虑每个房子对正研究的房子的影响显然是不现实的,因为可能有房子刚好当前边一部分,或中间一部分,或后面一部分,这个不好统一,所以事先排序能明确统计 #include <i

UVA 12096 STL map set 的使用

set这个容器也是STL库的一员,并且在algorithm内直接有 set_union set_intersection  这样求并集交集的操作 map 最方便的地方就是 支持下标访问 举例说明 : 1 #include<iostream> 2 include<cstdio> 3 #include<cstring> 4 #include<vector> 5 #include<map> 6 #include<set> 7 #includ

UVA 221 - Urban Elevations(离散化)!!!!!!

题意:给出一张俯视图.给出N个建筑物的左下标,长度,宽度,高度.现在求,从南面看,能看到那些建筑? Sample Input 14 160 0 30 60 30 125 0 32 28 60 95 0 27 28 40 70 35 19 55 90 0 0 60 35 80 0 40 29 20 60 35 40 25 45 80 0 67 25 20 50 0 92 90 20 80 95 38 55 12 50 95 60 60 13 30 95 80 45 25 50 165 65 15

UVA 221 Urban Elevations

思路: 一些解释: ①:建筑的排序: 下面是以输入顺序为标号,在数组bd中的顺序: 排序后在数组bd中的顺序: 以后我们比较就按这个顺序 ②:x坐标的排序 x的内容是每一个建筑的左边界和右边界,我们把他去重排序后,就是一个一个的坐标,相邻的x形成一个区间, 取它的中点来判断,比如,样例输入的bd[1]就是遍历所有的区间来判断是否可见.下面附上调试截图. x: sort后的x: unique后的x: 1 #include<cstdio> 2 #include<algorithm> 3

Urban Elevations UVA - 221

题目大意:给出建筑的俯视图,以及每个建筑的左下角坐标,宽度,长度,高度.求正视图可观察到的建筑的编号 思路:建筑物的可见性等于南墙的可见性,依据左下角排序后,逐个判断每个建筑是否可见.对南墙的x坐标进行排序,相邻两个x坐标之间的南墙可见性一致,通过判断这部分南墙中的特殊点(中间点)可以得到这部分墙的可见性.如果这部分墙可见,那么这部分墙 归属的建筑可见. #include<bits/stdc++.h> using namespace std; #define LL long long #def

UVa 221城市正视图(离散化)

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=157 题意:输入建筑物的x,y坐标,宽度,深度和高度,输出从南向北看时能看到的建筑物. 这道题需要用到离散化,将所有建筑物物的左右边界坐标存储起来,然后排序去重,那么任意两个相邻x坐标形成的区间要么是可见的,要么就是不可见的.这样只需在这个区间内任选一点(如中点),当该建筑物可见时,首先它的

UVA 221 城市化地图(离散化)

题意: 分析: 记录一个一开始就想错的观点, 以为只要把x 和 width放大到到足够大(例如10000倍,倍数越高精度越高),然后排序填充一下数轴就可以,就可以解决x坐标是小数的问题.但这样打了一下,发现第一计算速度很慢(放大后n倍计算量也同时放大n^2倍), 第二是无法处理覆盖与重叠的部分, 只会保留数轴中最大的部分, 无法保留在高楼南边的矮楼.