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 blank line must separate output from consecutive input records.(一开始没注意审题,wa在这了┭┮﹏┭┮)

思路:
首先,这个题我本来没什么思路,还是不得不参考一波刘汝佳老师的思路
本题最大的收获是初步认识了 “离散化” :将无限转化为有限的方法。
- 首先,我们注意到,每个建筑物的深度在这里没有影响,因此深度是个干扰项
- 一个关键点是,题目给定的数据是实数,即浮点数,因此我们不能穷举所有的x坐标来遍历,对于无穷问题,我们需要考虑离散化,化无穷为有限
- 对于本题,离散化的关键在于,如何表示建筑物之间的互相重叠的关系
- 必须注意到,每个建筑物有2个x坐标,一个是input中直接给出的x,而另一个是我们可以通过w+x得到的“右边的x坐标”
- 通过2个坐标,我们可以首先对x去重,然后构建出相应的x轴的多个区间,这样,每一组重叠关系必然会落在我们的x区间之中。这也正是代码中x数组开2倍空间的原因,以及用途。
- 我们只需在区间内任选一点,即可作为区间的整体代表元素,来判断某个建筑是否经过了此区间,因此,可以选择比较方便的区间中点。没有经过区间代表元素的,显然不会经过该区间。经过了第5步和这一步,我们就将一个无限问题,转化为有限问题了。
- 对于每个建筑,我们考虑2点:是否经过了区间中点;是否存在y坐标小于它,且高度大于等于它的建筑。上述两点满足任何一点,则该建筑都不可见
- 其他小细节:代码 53 行的 b[j].y < b[i].y 能够保证 i != j; 53行的判定语句的顺序也可以些微提高代码效率,比如将函数调用延迟到最后一个,以降低调用概率,降低平均运行时间;unique() 函数调用前必须首先排序,因为unique函数只能对相邻元素去重,这和unique的原理有关,话说,这里的unique函数真的没有python 里的 set() 好用啊。。。
代码如下:
// UVa 221 Urban Elevations
// Ruiyuan Lu
#include<cstdio>
#include<algorithm>
using namespace std; const int maxn = + ;
double x[maxn*]; // each building has 2 coordinates of x axis
int n; // number of the buildings struct Building{
int id;
double x, y, w, d, h; // w: means x_len, d:depth means y_len, h:height
bool operator < (const Building& b) const { // sort for output
return x < b.x || (x == b.x && y < b.y);
}
}b[maxn]; bool cover(int i, double mx); // determine if the mx is in the range of building's x coordinate
bool visible(int i, double mx); // i: the index of buildings; mx: middle x coordinate of an interval int main(){
int cnt = ;
while(scanf("%d", &n) == && n > ){
for(int i=; i<n;i++){
scanf("%lf%lf%lf%lf%lf", &b[i].x, &b[i].y, &b[i].w, &b[i].d, &b[i].h);
b[i].id = i + ;
x[i*] = b[i].x; x[i*+] = b[i].x + b[i].w; // init x for discretization
}
sort(x, x+n*); // sort before unique() is invoked
sort(b, b+n); // sort for output
int m = unique(x, x+maxn*) - x; // get the number of unique x in the array
// print result
if(cnt++)printf("\n"); // print the '\n' for last output
printf("For map #%d, the visible buildings are numbered as follows:\n%d", cnt, b[].id);
for(int i=;i<n;i++)
for(int j=;j<m;j++) // check each building if it is visible in any interval of m intervals
if(visible(i, (x[j-] + x[j]) / )){
printf(" %d", b[i].id);
break;
}
printf("\n"); // as they required: One blank line must separate output from consecutive input records.
}
} bool cover(int i, double mx){
return b[i].x <= mx && b[i].x + b[i].w >= mx;
} bool visible(int i, double mx){
if(!cover(i, mx)) return false;
for(int j=;j<n;j++)
if(b[j].y < b[i].y && b[j].h >= b[i].h && cover(j, mx)) return false;
return true;
}

啦啦啦,今天就到这里啦~改天见*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。
UVa 221 Urban Elevations 城市正视图 离散化初步 无限化有限的更多相关文章
- UVA 221 - Urban Elevations(离散化)!!!!!!
题意:给出一张俯视图.给出N个建筑物的左下标,长度,宽度,高度.现在求,从南面看,能看到那些建筑? Sample Input 14 160 0 30 60 30 125 0 32 28 60 95 0 ...
- UVA 221 Urban Elevations
思路: 一些解释: ①:建筑的排序: 下面是以输入顺序为标号,在数组bd中的顺序: 排序后在数组bd中的顺序: 以后我们比较就按这个顺序 ②:x坐标的排序 x的内容是每一个建筑的左边界和右边界,我们把 ...
- 算法习题---5.12城市正视图<离散化应用>(Uva221)*****
一:题目 给定n坐房子的西南角坐标x, y.还有宽度w,长度d(其实没用),高度h.问从南面看过去能看到几座房子. 城市俯视图和主视图 注意: 输出主视图中能够看到的所有建筑物按照左下角x坐标从小到大 ...
- UVa 221 (STL 离散化) Urban Elevations
题意: 作图为n个建筑物的俯视图,右图为从南向北看的正视图,按从左往右的顺序输出可见建筑物的标号. 分析: 题中已经说了,要么x相同,要么x相差足够大,不会出现精度问题. 给这n个建筑物从左往右排序, ...
- X - Urban Elevations
Urban Elevations An elevation of a collection of buildings is an orthogonal projection of the buil ...
- R语言︱噪声数据处理、数据分组——分箱法(离散化、等级化)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 分箱法在实际案例操作过程中较为常见,能够将一些 ...
- UVa 221城市正视图(离散化)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 【紫书】Urban Elevations UVA - 221 离散化
题意:给你俯视图,要求依次输出正视图中可以看到的建筑物 题解:任意相邻的x间属性相同,所以离散化. 坑:unique只能对数组用.下标易错 list不能找某元素的next.用了个很麻烦的处理 数组: ...
- Urban Elevations UVA - 221
题目大意:给出建筑的俯视图,以及每个建筑的左下角坐标,宽度,长度,高度.求正视图可观察到的建筑的编号 思路:建筑物的可见性等于南墙的可见性,依据左下角排序后,逐个判断每个建筑是否可见.对南墙的x坐标进 ...
随机推荐
- String StrigBuffer StringBuilder 浅解
1.String是最基本的字符串类,用于表示字符串. 特点:对象内容不可变,但可以通过指向不同的对象来“表示”不同的内容. 使用场景:如果不涉及到内容改变,可以使用String. 注意:如果想将Str ...
- 【BZOJ1221】【HNOI2001】软件开发 [费用流]
软件开发 Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description 某软件公司正在规划一项n天的软件开 ...
- python碎片记录(二)
1.字典中嵌套字典使用 dict={'a':{1:2,2:3}} print(dict) print(dict['a'][2]) 输出如下: {'a': {1: 2, 2: 3}} 3 2.元组与l ...
- JSP九大内置对象,七大动作,三大指令
JSP之九大内置对象 隐藏对象入门探索 Servlet 和JSP中输出数据都需要使用out对象.Servlet 中的out对象是通过getWriter()方法获取的.而JSP中没有定义out对象却可以 ...
- 【Sqlite3】sqlite_sequence表(转)
sqlite_sequence表也是SQLite的系统表.该表用来保存其他表的RowID的最大值.数据库被创建时,sqlite_sequence表会被自动创建.该表包括两列.第一列为name,用来存储 ...
- python模块(requests,logging)
一.requests Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythone ...
- python基础===抽象
懒惰即美德 斐波那契数列: >>> fibs = [0,1] >>> for i in range(8): fibs.append(fibs[-2]+fibs[-1 ...
- ARM linux的启动部分源代码简略分析【转】
转自:http://www.cnblogs.com/armlinux/archive/2011/11/07/2396784.html ARM linux的启动部分源代码简略分析 以友善之臂的mini2 ...
- Docker壳的配置笔记
docker 就是一个运行容器,在这个盒子里,他的端口,路径可以虚拟到另一个实际的磁盘上,运行空间独立,更安全! yum install -y docker docker-client service ...
- C中级 数据序列化简单使用和讨论 (二)
引言 - 一种更好的方式 其实不管什么语言, 开发框架都会遇到序列化问题. 序列化可以理解为A 和 B 交互的一种协议. 很久以前利用 printf 和 scanf 的协议实现过一套序列化问题. C ...