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

 #include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std; const int maxn = ; struct Building{
int id;
double x, y, w, d, h;
bool operator < (const Building& rhs) const{
return x < rhs.x || (x == rhs.x && y < rhs.y); //重载<运算符
}
}b[maxn]; int n;
double x[*maxn]; bool solve(int i, double mi)
{
if(!(b[i].x<=mi && b[i].x + b[i].w>=mi)) return false; //该中点不在建筑物b[i]范围内时返回false
for(int k = ; k < n;k++)
{
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;
//若该建筑物前面有建筑物并且高度大于等于该建筑物时,返回false
}
return true;
} int main()
{
int kase = ;
while (cin >> n, n)
{
memset(x, , sizeof(x));
for (int i = ; i < n; i++)
{
cin >> 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;
}
sort(b, b + n); //以重载方法进行排序
sort(x, x + * n);
int m = unique(x, x + *n) - x; //得到不重复的x坐标个数
if(kase++) cout << endl;
cout << "For map #" << kase << ", the visible buildings are numbered as follows:" << endl << b[].id;
for (int i = ; i < n; i++)
{
bool vis = false;
for (int j = ; j < m; j++)
{
if (solve(i, (x[j] + x[j + ]) / )) { vis = true; break; }
}
if (vis == true) cout << " " << b[i].id;
}
cout << endl;
}
return ;
}

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

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

    转载请注明: 仰望高端玩家的小清新 http://www.cnblogs.com/luruiyuan/ 题目大意: 题目传送门:UVa 221 Urban Elevations 给出城市中建筑物的x, ...

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

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

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

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

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

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

  5. UVA 221 城市化地图(离散化思想)

    题意: 给出若干个栋楼俯视图的坐标和面积,求从俯视图的南面(可以视为正视图)看过去到底能看到多少栋楼. 输入第一个n说明有n栋楼,然后输入5个实数(注意是实数),分别是楼的左下角坐标(x,y), 然后 ...

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

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

  7. 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树

    [BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...

  8. Urban Elevations UVA - 221

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

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

    题意: 给出一些边平行于坐标轴的长方体,这些长方体可能相交.也可能相互嵌套.这些长方体形成了一个雕塑,求这个雕塑的整体积和表面积. 题解: 最easy想到直接进行bfs或者dfs统计,但此题的麻烦之处 ...

随机推荐

  1. python取文件最后几行

    with open("text.txt") as f:     txt=f.readlines() keys=[k for k in range(0,len(txt))] resu ...

  2. I had lots of shrapnel in my leg

    People were running up to us, and screaming and hitting us, and throwing stones and eggs. "They ...

  3. oracle:ORACLE 实际返回的行数超出请求的行数

    写的存储过程,执行后一直报实际返回的行数超出请求的行数的错误. 原因:select prdt_id into prdt_id from.... 两个变量名称相同造成的..哎  第一个变量换成大写..问 ...

  4. Mac下手动安装Chromedriver.exe

    Mac OS X Yosemite 10.10.4下,ChromeDriver运行异常,需要手动安装chromedriver.exe Step 1: 打开https://sites.google.co ...

  5. Android Studio 常用快捷键

     继承Eclipse的快捷键 : File->Settings->Keymap->有一个Keymaps 下拉菜单,选择Eclipse.    这里讲主要常用的快捷键 :  Ctrl ...

  6. HSLA颜色

    CSS2中色彩模式只有RGB色彩模式(RGB即RED.Green.BLue)和十六进制模式,为了能支持 透明opacity 的Alpha值,CSS3又增加了RGBA色彩模式(RGBA即RED.Gree ...

  7. Mac小知识(不定时更新)

    1.显示隐藏文件夹(在mac命令行中输入以下代码即可): 1)显示隐藏文件夹 defaults write com.apple.finder AppleShowAllFiles Yes &&a ...

  8. 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。此 RPC 请求中提供了过多的参数。最多应为 2100

    出现这个问题的背景是,判断一批激活码在系统中是否已经存在,很傻的一个作法是,把这一批激活码,以in(in (‘ddd‘,‘aaa‘))的形式来处理,导致问题的出现. 后来,查找资料,http://bb ...

  9. tomcat 更新class文件

    在eclipse中写入新代码,debug并没有执行新的代码 原因:部署在tomcat的class文件没有更新,也就是当前的代码没有编译到tomcat的工作目录中 解决方案: project-clean ...

  10. LinuxMint17.1 Rebecca中安装设置输入法

    LinuxMint14使用了几年一直未更新,突然想去更新一下去发现源已经不支持了,所以就直接安装了最新版本. 安装好以后发现还是跟以前一样的毛病,没有中文输入法,直接sudo aptitude ins ...