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

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=157

题意:输入建筑物的x,y坐标,宽度,深度和高度,输出从南向北看时能看到的建筑物。

这道题需要用到离散化,将所有建筑物物的左右边界坐标存储起来,然后排序去重,那么任意两个相邻x坐标形成的区间要么是可见的,要么就是不可见的。这样只需在这个区间内任选一点(如中点),当该建筑物可见时,首先它的左右边界必须包含这个中点,其次,在它前面不能有比它高的建筑物。

在排序去重时需要用到unique函数,它是c++中的去重函数,但是它不会删除那些重复的函数,而是把它们移到了数组的最后,当需要获得该数组中不重复元素的个数,则是这样的形式unique(x, x + 2*n) - x

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<string>
 4 #include<cstring>
 5 using namespace std;
 6
 7 const int maxn = 105;
 8
 9 struct Building{
10     int id;
11     double x, y, w, d, h;
12     bool operator < (const Building& rhs)    const{
13         return x < rhs.x || (x == rhs.x && y < rhs.y); //重载<运算符
14     }
15 }b[maxn];
16
17 int n;
18 double x[2*maxn];
19
20 bool solve(int i, double mi)
21 {
22     if(!(b[i].x<=mi && b[i].x + b[i].w>=mi))  return false; //该中点不在建筑物b[i]范围内时返回false
23     for(int k = 0; k < n;k++)
24     {
25         if (b[k].y<b[i].y && b[k].h >= b[i].h && b[k].x <= mi && b[k].x + b[k].w >= mi)  return false;
26         //若该建筑物前面有建筑物并且高度大于等于该建筑物时,返回false
27     }
28     return true;
29 }
30
31 int main()
32 {
33     int kase = 0;
34     while (cin >> n, n)
35     {
36         memset(x, 0, sizeof(x));
37         for (int i = 0; i < n; i++)
38         {
39             cin >> b[i].x >> b[i].y >> b[i].w >> b[i].d >> b[i].h;
40             b[i].id = i + 1;
41             x[2 * i] = b[i].x;
42             x[2 * i + 1] = b[i].x + b[i].w;
43         }
44         sort(b, b + n);  //以重载方法进行排序
45         sort(x, x + 2 * n);
46         int m = unique(x, x + 2*n) - x;     //得到不重复的x坐标个数
47         if(kase++)  cout << endl;
48         cout << "For map #" << kase << ", the visible buildings are numbered as follows:" << endl << b[0].id;
49         for (int i = 1; i < n; i++)
50         {
51             bool vis = false;
52             for (int j = 0; j < m; j++)
53             {
54                 if (solve(i, (x[j] + x[j + 1]) / 2))   { vis = true; break; }
55             }
56             if (vis == true)  cout << " " << b[i].id;
57         }
58         cout << endl;
59     }
60     return 0;
61 }
时间: 2024-11-06 15:15:14

UVa 221城市正视图(离散化)的相关文章

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 (STL 离散化) Urban Elevations

题意: 作图为n个建筑物的俯视图,右图为从南向北看的正视图,按从左往右的顺序输出可见建筑物的标号. 分析: 题中已经说了,要么x相同,要么x相差足够大,不会出现精度问题. 给这n个建筑物从左往右排序,每个建筑物的两个端点,排序去重以后可以得到m个相邻的小区间.枚举这些区间,判断建筑物是否可见. 离散化刚开始接触这个词,感觉十分高冷.现在来看倒是很形象,因为是浮点数,所以不可能枚举所有的横坐标,但可以分割成若干的小区间,这个进行判断.即:将无限变为有限. 再说一下unique函数,调用之前必须先排

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 城市化地图(离散化)

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

hdu 2771(uva 12171) Sculpture bfs+离散化

题意: 给出一些边平行于坐标轴的长方体,这些长方体可能相交.也可能相互嵌套.这些长方体形成了一个雕塑,求这个雕塑的整体积和表面积. 题解: 最easy想到直接进行bfs或者dfs统计,但此题的麻烦之处在于求整个雕塑的外表面积和雕塑内部可能出现四个长方体所搭成的空心.空心不能计算到表面积中,可是计算整体积却要计入,于是直接bfs或者dfs不优点理.于是,能够想到直接统计整个雕塑外围的全部小方块.就可以非常方便地求出雕塑地表面积和体积(雕塑地整体积==整个空间地体积-外围想方块的体积),另一点就是因

Urban Elevations UVA - 221

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

UVa 1025 城市里的间谍

https://vjudge.net/problem/UVA-1025 题意:一个间谍要从第一个车站到第n个车站去会见另一个,在是期间有n个车站,有来回的车站,让你在时间T内时到达n,并且等车时间最短,输出最短等车时间. 思路:先用一个has_train[t][i][0]来表示在t时刻,在车站i,是否有往右开的车.同理,has_train[t][i][1]用来保存是否有往左开的车. 用d(i,j)表示时刻i,你在车站j,最少还需要等待多长时间.边界条件是d(T,n)=0,其他d(T,i)为正无穷

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

UVA 221 Urban Elevations

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