离散化处理。判断建筑可见性比较麻烦。下面采用离散化解决:把所有的x坐标排序去重,在相邻两个x坐标表示的区间中,整个区间要么同时可见,要么同时不可见。如何判断该区间是否可见?具体做法是选取该区间中点坐标x=mx来做代表,判断mx是否可见。那么判断该监周屋是否在点mx0可见?首先该建筑物必须包含该点,并且在他南边的包含该点的建筑物不能比它高。

//--------离散化处理技巧
//----------------------
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 100+ 5; struct Building{
int id;
double x, y, w, l, h;
bool operator<(Building m){
if (m.x == x)return y < m.y;
else return x < m.x;
} } b[maxn]; double x[2 * maxn];
int n,m; //判断下标为i的建筑物在x=mx处是否覆盖
bool cover(int i, double mx){
return mx<b[i].x + b[i].w&&mx>b[i].x;
} //判断建筑物是否在mx处可见
bool isVision(int i, double mx){
if (!cover(i, mx))return false;
//判断它南边是否有建筑物覆盖该点
for (int k = 0; k < n; k++){
if (b[k].y<b[i].y&&b[k].h>=b[i].h&&cover(k, mx))
return false;
}
return true;
}
int main(){
int kase = 1;
while (scanf("%d", &n) && n){
for (int i = 0; i < n; i++){
scanf("%lf%lf%lf%lf%lf",&b[i].x, &b[i].y, &b[i].w, &b[i].l, &b[i].h);
b[i].id = i + 1;
x[2 * i] = b[i].x, x[2 * i + 1] = b[i].x + b[i].w;
}
sort(b, b + n);
sort(x, x + 2 * n);
//去重复
m = unique(x, x + 2*n) - x; vector<int>v;
int j;
for (int i = 0; i < n; i++){
//枚举每一个mx
for (j = 0; j < m - 1; j++){
if (isVision(i, (x[j] + x[j + 1]) / 2))
break; //一旦遇到当前建筑物在该点可见则跳出循环
}
if (j<m-1)v.push_back(b[i].id);
}
if (kase>1)printf("\n");
printf("For map #%d, the visible buildings are numbered as follows:\n", kase++);
printf("%d", v[0]);
for (int i = 1; i < v.size(); i++)printf(" %d", v[i]);
printf("\n");
}
return 0;
}

  

UVa221 Urban Elevations的更多相关文章

  1. X - Urban Elevations

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

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

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

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

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

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

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

  5. Urban Elevations UVA - 221

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

  6. UVA 221 Urban Elevations

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

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

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

  8. 紫书第5章 C++STL

    例题 例题5-1 大理石在哪儿(Where is the Marble?,Uva 10474) 主要是熟悉一下sort和lower_bound的用法 关于lower_bound: http://blo ...

  9. Urban Planning and Public Health - Reflection on Professor Webster's article in Urban Planning Forum

    1. General review. Professor Webster published this article in Urban Planning Forum, one of the top ...

随机推荐

  1. 物联网第一次作业--我眼中的物联网——从认识RFID开始

    无线射频识别技术(Radio FrequencyIdentification,简称:RFID)是一种非接触式的自动识别技术,其基本原理是利用射频信号和空间耦合(电感或电磁耦合)或雷达反射的传输特性,实 ...

  2. MyBatis 基本演示

    主配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration P ...

  3. Codeforces Round #386 (Div. 2) 746F(set的运用)

    题目大意 给出一个歌单(有n首歌),每个歌都有愉悦值和时间,你可以选择从第x首歌开始听(也就是选择连续的一段),并且你可以选择w首歌让它的时间减半,限制时间为k,求最大的愉悦值 首先我们需要贪心一下, ...

  4. [洛谷P4889]kls与flag

    题目大意:有$n$根竹竿,第$i$根竹竿在$i$位置,第​$i$根竹竿高度为​$h_i$,每根竹竿可以向左倒或向右倒,问有几对竹竿倒下后顶端重合. 题解:求出每根竹竿倒下后的位置,离散化,记录一下每个 ...

  5. [NC2018-9-9T1]中位数

    题目大意:给你一个长度为$n$的序列,要求出长度大于等于$len$的字段的中位数中最大的一个中位数 题解:可以二分答案,对于比它小的数赋成$-1$,大的赋成$1$.求前缀和,若有一段区间的和大于$0$ ...

  6. 输出读入优化——QAQ

    #include<bits/stdc++.h> const int RN=1e5; ],*ip=ib+RN,ob[RN+],*op=ob; inline int gc(){ ip==ib+ ...

  7. 【IDEA】IDEA创建Maven的Web项目并运行以及打包

     0.IDEA集成Maven并设置Maven的配置 idea15之后的版本,都自带了maven插件,idea14貌似需要自己安装,方法也很简单:File->Settings->Plugin ...

  8. python--jinja2

    from jinja2 import Template # 创建一个Template模板去渲染它 s = "my name is {{mashiro}}" t = Template ...

  9. 如何使用python发送邮件

    使用python发送邮件,用的是SMTP协议. 因此在qq邮箱中,要设置开启SMTP服务 只要能开启一个就行 在我们执行程序的时候,会发现邮件被发送过来了 在python中还有一个更简单的第三方模块, ...

  10. 使用两个 Windows 窗体 DataGridView 控件创建一个主/从窗体

    使用 DataGridView 控件的一种最常见方案是“主/详细信息”窗体,这样的窗体可显示两个数据库表之间的父/子关系.如果选择主表中的行,将导致以相应的子数据来更新详细信息表. 主/详细信息窗体很 ...