转载请注明:

仰望高端玩家的小清新 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在这了┭┮﹏┭┮)

思路:

首先,这个题我本来没什么思路,还是不得不参考一波刘汝佳老师的思路

本题最大的收获是初步认识了 “离散化” :将无限转化为有限的方法。

  1. 首先,我们注意到,每个建筑物的深度在这里没有影响,因此深度是个干扰项
  2. 一个关键点是,题目给定的数据是实数,即浮点数,因此我们不能穷举所有的x坐标来遍历,对于无穷问题,我们需要考虑离散化,化无穷为有限
  3. 对于本题,离散化的关键在于,如何表示建筑物之间的互相重叠的关系
  4. 必须注意到,每个建筑物有2个x坐标,一个是input中直接给出的x,而另一个是我们可以通过w+x得到的“右边的x坐标”
  5. 通过2个坐标,我们可以首先对x去重,然后构建出相应的x轴的多个区间,这样,每一组重叠关系必然会落在我们的x区间之中。这也正是代码中x数组开2倍空间的原因,以及用途。
  6. 我们只需在区间内任选一点,即可作为区间的整体代表元素,来判断某个建筑是否经过了此区间,因此,可以选择比较方便的区间中点。没有经过区间代表元素的,显然不会经过该区间经过了第5步和这一步,我们就将一个无限问题,转化为有限问题了。
  7. 对于每个建筑,我们考虑2点:是否经过了区间中点;是否存在y坐标小于它,且高度大于等于它的建筑。上述两点满足任何一点,则该建筑都不可见
  8. 其他小细节:代码 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 城市正视图 离散化初步 无限化有限的更多相关文章

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

    题意:给出一张俯视图.给出N个建筑物的左下标,长度,宽度,高度.现在求,从南面看,能看到那些建筑? Sample Input 14 160 0 30 60 30 125 0 32 28 60 95 0 ...

  2. UVA 221 Urban Elevations

    思路: 一些解释: ①:建筑的排序: 下面是以输入顺序为标号,在数组bd中的顺序: 排序后在数组bd中的顺序: 以后我们比较就按这个顺序 ②:x坐标的排序 x的内容是每一个建筑的左边界和右边界,我们把 ...

  3. 算法习题---5.12城市正视图<离散化应用>(Uva221)*****

    一:题目 给定n坐房子的西南角坐标x, y.还有宽度w,长度d(其实没用),高度h.问从南面看过去能看到几座房子. 城市俯视图和主视图 注意: 输出主视图中能够看到的所有建筑物按照左下角x坐标从小到大 ...

  4. UVa 221 (STL 离散化) Urban Elevations

    题意: 作图为n个建筑物的俯视图,右图为从南向北看的正视图,按从左往右的顺序输出可见建筑物的标号. 分析: 题中已经说了,要么x相同,要么x相差足够大,不会出现精度问题. 给这n个建筑物从左往右排序, ...

  5. X - Urban Elevations

     Urban Elevations  An elevation of a collection of buildings is an orthogonal projection of the buil ...

  6. R语言︱噪声数据处理、数据分组——分箱法(离散化、等级化)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 分箱法在实际案例操作过程中较为常见,能够将一些 ...

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

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

  8. 【紫书】Urban Elevations UVA - 221 离散化

    题意:给你俯视图,要求依次输出正视图中可以看到的建筑物 题解:任意相邻的x间属性相同,所以离散化. 坑:unique只能对数组用.下标易错 list不能找某元素的next.用了个很麻烦的处理 数组: ...

  9. Urban Elevations UVA - 221

    题目大意:给出建筑的俯视图,以及每个建筑的左下角坐标,宽度,长度,高度.求正视图可观察到的建筑的编号 思路:建筑物的可见性等于南墙的可见性,依据左下角排序后,逐个判断每个建筑是否可见.对南墙的x坐标进 ...

随机推荐

  1. Java设计模式の适配器模式

    定义 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的用途 用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极 ...

  2. word2vec Explained: deriving Mikolov et al.'s negative-sampling word-embedding method

    最近接到任务研究word2vec,感觉网络上关于这个的资料层次不齐,总感觉解释的都没有那么完善.或许就连作者本人也不是非常清楚为什么他的模型好使.论文中提到的negtive sampling给了我很大 ...

  3. Android检测View的可见性

    Android中我们经常会用到判断View的可见行,当然有人会说View.VISIBLE就可以了,但是有时候这个真是满足不了,有时候我们为了优化,在View滚到得不可见的时候或者由于滚到只显示了部分内 ...

  4. Python 对象模型 -- (转)

    面向对象的纯粹性 在很久很久以前,C++还被称为面向对象语言(现在一般称为多范式通用语言),人们就对C++的面向对象的纯粹性提出了质疑,主要有以下几点: 并非所有的对象都是对象(很拗口?),比如指针本 ...

  5. bugku逗号过滤注入

    URL:http://120.24.86.145:8002/web15/ 直接给出了源码: <?php error_reporting(0); function getIp(){ $ip = ' ...

  6. Linux 入门记录:十、Linux 下获取帮助

    一.获取帮助 Linux 提供了极为详细的帮助工具和文档,通过查阅相关文档,可以大大减少需要记忆的东西并提高效率. 二.--help参数 几乎所有命令都可以使用 -h 或 --help 参数获取命令的 ...

  7. Laravel 项目上线的一些注意事项

    1.应用生产环境 在 .env 文件里设置 APP_ENV=production 2.关闭调试模式 在 .env 文件中设置 APP_DEBUG = false 3.生成 APP_KEY 使用 Art ...

  8. HDU 5136 Yue Fei's Battle

    题目链接:HDU-5136 网上的一篇题解非常好,所以就直接转载了.转自oilover的博客 代码: #include<cstring> #include<cstdio> #i ...

  9. python 数据类型 变量 注释

    基本数据类型: 数字 number :整数 int . 浮点数 float.复数 complex.布尔值 bool 列表 list  :  使用 方括号  []  表示,例如: [1,2,'abc'] ...

  10. C#多线程编程之:集合类中Synchronized方法与SyncRoot属性原理分析

    我们知道,在.net的一些集合类型中,譬如Hashtable和ArrayList,都有Synchronized静态方法和SyncRoot属性,他们之间有联系吗?我怎么才能用好他们呢? 以Hashtab ...