UVA 221 Urban Elevations
思路:

一些解释:
①:建筑的排序:
下面是以输入顺序为标号,在数组bd中的顺序:

排序后在数组bd中的顺序:

以后我们比较就按这个顺序
②:x坐标的排序
x的内容是每一个建筑的左边界和右边界,我们把他去重排序后,就是一个一个的坐标,相邻的x形成一个区间,
取它的中点来判断,比如,样例输入的bd[1]就是遍历所有的区间来判断是否可见。下面附上调试截图。
x:

sort后的x:

unique后的x:

#include<cstdio>
#include<algorithm>
using namespace std;
struct building {
int NO;
double x, y, width, depth, height;
double xr;//右边界
}bd[];
double x[ * ];
int n;
bool cmp(building & b1, building & b2)
{
if (b1.x < b2.x)
return true;
if (b1.x == b2.x&&b1.y < b2.y)
return true;
return false;
}
bool cover(int i, double mx)//看mx在不在第i个建筑范围内
{
return ((bd[i].x <= mx) && (bd[i].xr >= mx));
}
bool visible(int i, double mx)//第i个建筑物在x=mx是否可见
{
if (!cover(i, mx))
return false;
for (int j = ; j < n; j++)//遍历所有建筑,寻找第i个建筑[南方]的建筑看会不会被挡住
{
if (bd[j].y < bd[i].y&&bd[j].height >= bd[i].height&&cover(j,mx))
return false;
/*bd[j].y < bd[i].y在此建筑的南方
bd[j].height >= bd[i].height,南方建筑更高
cover(j,mx) mx也在南方建筑范围内
*/
}
return true;
}
int main()
{
int kase = ;
while (scanf("%d", &n) && n != )
{
for (int i = ; i < n; i++)
{
scanf("%lf%lf%lf", &bd[i].x, &bd[i].y, &bd[i].width);
scanf("%lf%lf", &bd[i].depth, &bd[i].height);
bd[i].NO = i+;
bd[i].xr = bd[i].x + bd[i].width;
x[i * ] = bd[i].x;//记录左边界
x[i * + ] = bd[i].xr;//右边界
} sort(bd, bd + n, cmp);
sort(x, x + * n);
int m = unique(x, x + n * ) - x;//不重复元素的个数
if (kase++)
printf("\n");
printf("For map #%d, the visible buildings are numbered as follows:\n%d", kase,bd[].NO);
//因为第一个输出没有空格,而第一个bd肯定不会被挡住,
//所有先把第一个输出来.下面从1开始
for (int i = ; i < n; i++)
{
bool vis = false;
for (int j = ; j < m-; j++)
{
if (visible(i, (x[j] + x[j+]) / ))
{
vis = true;
break;
}
}
if (vis)
printf(" %d", bd[i].NO);
}
printf("\n");
}
return ;
}
UVA 221 Urban Elevations的更多相关文章
- UVa 221 Urban Elevations 城市正视图 离散化初步 无限化有限
转载请注明: 仰望高端玩家的小清新 http://www.cnblogs.com/luruiyuan/ 题目大意: 题目传送门:UVa 221 Urban Elevations 给出城市中建筑物的x, ...
- UVA 221 - Urban Elevations(离散化)!!!!!!
题意:给出一张俯视图.给出N个建筑物的左下标,长度,宽度,高度.现在求,从南面看,能看到那些建筑? Sample Input 14 160 0 30 60 30 125 0 32 28 60 95 0 ...
- X - Urban Elevations
Urban Elevations An elevation of a collection of buildings is an orthogonal projection of the buil ...
- UVa 221 (STL 离散化) Urban Elevations
题意: 作图为n个建筑物的俯视图,右图为从南向北看的正视图,按从左往右的顺序输出可见建筑物的标号. 分析: 题中已经说了,要么x相同,要么x相差足够大,不会出现精度问题. 给这n个建筑物从左往右排序, ...
- Urban Elevations UVA - 221
题目大意:给出建筑的俯视图,以及每个建筑的左下角坐标,宽度,长度,高度.求正视图可观察到的建筑的编号 思路:建筑物的可见性等于南墙的可见性,依据左下角排序后,逐个判断每个建筑是否可见.对南墙的x坐标进 ...
- 【紫书】Urban Elevations UVA - 221 离散化
题意:给你俯视图,要求依次输出正视图中可以看到的建筑物 题解:任意相邻的x间属性相同,所以离散化. 坑:unique只能对数组用.下标易错 list不能找某元素的next.用了个很麻烦的处理 数组: ...
- UVa 221城市正视图(离散化)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa221 Urban Elevations
离散化处理.判断建筑可见性比较麻烦.下面采用离散化解决:把所有的x坐标排序去重,在相邻两个x坐标表示的区间中,整个区间要么同时可见,要么同时不可见.如何判断该区间是否可见?具体做法是选取该区间中点坐标 ...
- UVA 221 城市化地图(离散化思想)
题意: 给出若干个栋楼俯视图的坐标和面积,求从俯视图的南面(可以视为正视图)看过去到底能看到多少栋楼. 输入第一个n说明有n栋楼,然后输入5个实数(注意是实数),分别是楼的左下角坐标(x,y), 然后 ...
随机推荐
- 伪Ap接入点
1.创建一个伪造的Ap接入点,必须购买一个无线网卡的设备,接受功率在300Mbps ,低于这个传输速率的值,效果很差,都达到用户可以连接验证的效果.其芯片必须支持kali linux 内核系统. 2. ...
- HTML&javaSkcript&CSS&jQuery&ajax(七)
’一.HTML5 实例 <video width="430" controls> <source src="mov_nnn.mp4" t ...
- bzoj 4816
这题是莫比乌斯反演的典型题也是很有趣的题. 题意:求,其中f为为斐波那契数列 那么首先观察一下指数,发现是我们熟悉的形式,可以转化成这样的形式: 令T=kd,且假设n<m,有: 令 则原式= 这 ...
- Linux之man命令详解及中文汉化
使用方法 Linux man中的man就是manual的缩写,用来查看系统中自带的各种参考手册 使用方法: man command 示例: [root@VM_0_13_centos ~]# man l ...
- Centos7上vsftp脚本--> sh vsftp.sh 用户名 密码 --> sh vsftp.sh install
#!/bin/bash #vsftp install . /etc/rc.d/init.d/functions users=/etc/vsftpd/vftpuser.txt login=/etc/vs ...
- Centos7上配置网络和本地yum方法
配置网络yum源 前提:1.这个系统能上网 2.vim /etc/resolv.conf nameserver 8.8.8.8 nameserver 114.114.114.114 操作如下: 1.m ...
- B: Ocean的游戏(前缀和)
B: Ocean的游戏 Time Limit: 1 s Memory Limit: 128 MB Submit My Status Problem Description 给定一个字符串s, ...
- mysql的innodb存储引擎
innodb是支持事务的存储引擎,支持ACID特性的ACID(指数据库事务正确执行的四个基本要素的缩写) 包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolatio ...
- PV-UV-QPS
QPS:每秒查询率(Query Per Second) ,每秒的响应请求数,也即是最大吞吐能力.QPS = req/sec = 请求数/秒QPS统计方式 [一般使用 http_load 进行统计]QP ...
- 【AtCoder】ARC074
ARC 074 C - Chocolate Bar 直接枚举第一刀横切竖切,然后另一块要求如果横切分成\(H / 2\)竖切分成\(W/2\)即可 #include <bits/stdc++.h ...