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

  1. //--------离散化处理技巧
  2. //----------------------
  3. #define _CRT_SECURE_NO_DEPRECATE
  4. #include<iostream>
  5. #include<vector>
  6. #include<algorithm>
  7. #include<cmath>
  8. using namespace std;
  9. const int maxn = 100+ 5;
  10.  
  11. struct Building{
  12. int id;
  13. double x, y, w, l, h;
  14. bool operator<(Building m){
  15. if (m.x == x)return y < m.y;
  16. else return x < m.x;
  17. }
  18.  
  19. } b[maxn];
  20.  
  21. double x[2 * maxn];
  22. int n,m;
  23.  
  24. //判断下标为i的建筑物在x=mx处是否覆盖
  25. bool cover(int i, double mx){
  26. return mx<b[i].x + b[i].w&&mx>b[i].x;
  27. }
  28.  
  29. //判断建筑物是否在mx处可见
  30. bool isVision(int i, double mx){
  31. if (!cover(i, mx))return false;
  32. //判断它南边是否有建筑物覆盖该点
  33. for (int k = 0; k < n; k++){
  34. if (b[k].y<b[i].y&&b[k].h>=b[i].h&&cover(k, mx))
  35. return false;
  36. }
  37. return true;
  38. }
  39. int main(){
  40. int kase = 1;
  41. while (scanf("%d", &n) && n){
  42. for (int i = 0; i < n; i++){
  43. scanf("%lf%lf%lf%lf%lf",&b[i].x, &b[i].y, &b[i].w, &b[i].l, &b[i].h);
  44. b[i].id = i + 1;
  45. x[2 * i] = b[i].x, x[2 * i + 1] = b[i].x + b[i].w;
  46. }
  47. sort(b, b + n);
  48. sort(x, x + 2 * n);
  49. //去重复
  50. m = unique(x, x + 2*n) - x;
  51.  
  52. vector<int>v;
  53. int j;
  54. for (int i = 0; i < n; i++){
  55. //枚举每一个mx
  56. for (j = 0; j < m - 1; j++){
  57. if (isVision(i, (x[j] + x[j + 1]) / 2))
  58. break; //一旦遇到当前建筑物在该点可见则跳出循环
  59. }
  60. if (j<m-1)v.push_back(b[i].id);
  61. }
  62. if (kase>1)printf("\n");
  63. printf("For map #%d, the visible buildings are numbered as follows:\n", kase++);
  64. printf("%d", v[0]);
  65. for (int i = 1; i < v.size(); i++)printf(" %d", v[i]);
  66. printf("\n");
  67. }
  68. return 0;
  69. }

  

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. BZOJ1055[HAOI2008]玩具取名 【区间dp + 记忆化搜索】

    题目 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后 他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够 ...

  2. 【CF edu 27 G. Shortest Path Problem?】

    time limit per test 3 seconds memory limit per test 512 megabytes input standard input output standa ...

  3. 【马克-to-win】学习笔记—— 第五章 异常Exception

    第五章 异常Exception [学习笔记] [参考:JDK中文(类 Exception)] java.lang.Object java.lang.Throwable java.lang.Except ...

  4. 《c程序设计语言》读书笔记-递归实现快速排序算法

    #include <stdio.h> void swap(int v[],int i,int j) { int temp; temp = v[i]; v[i] = v[j]; v[j] = ...

  5. nginx配置C compiler cc is not found

    1.需求 linux安装个编译器 参考资料:http://blog.csdn.net/testcs_dn/article/details/51461750

  6. 用hibernate.properties代替hibernate.cfg.xml配置常用的属性

    我们使用hibernate时经常在hibernate.cfg.xml文件中配置数据库连接的相关属性,是否显示sql语句,数据库的方言等,这些配置其实也可以在.properties文件中配置.现在我把这 ...

  7. bzoj [Sdoi2014]数数 AC自动机上dp

    [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1264  Solved: 636[Submit][Status][Discu ...

  8. git可视化工具相关资源

    TortoiseGit下载及其使用 TortoiseGit是一个开源项目,熟悉svn版本控制系统的小伙伴可能知道TorToisesvn.  下载:https://tortoisegit.org/dow ...

  9. Linux下的ACL

    ACL理论概述 9位的属主/属组/其他人访问控制系统已经得到证明是强大的,足以满足大多数管理方面的需求. 事实上,在所有非UNIX操作系统上都采用了一种实质上更为复杂的方式来管理对于文件的访问:访问控 ...

  10. 封装scroll()

    function scroll(){ if(window.pageYOffset !== undefined){ return { "top": window.pageYOffse ...