news 2026/5/15 4:08:12

UVa 221 Urban Elevations

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 221 Urban Elevations

题目分析

在城市的南部正射投影中,建筑物的可见性取决于其南面是否被其他建筑物遮挡。每个建筑物可以抽象为一个长方体,由西南角坐标(x,y)(x, y)(x,y)、宽度www(东西方向)、深度ddd(南北方向)和高度hhh描述。

可见性判定条件:建筑物的南面在投影中有严格正面积,即至少有一段区间没有被任何比它更靠南且高度不小于它的建筑物遮挡。

解题思路

  1. 坐标离散化:将所有建筑物的左边界xxx和右边界x+wx + wx+w收集起来,排序去重。每两个相邻坐标之间的中点可以代表一个小区间,只需检查这些中点即可判定整个建筑是否可见。

  2. 排序:按xxx坐标升序排列,xxx相同时按yyy坐标升序排列,保证输出顺序符合要求。

  3. 可见性判定

    • 对于建筑iii,遍历每个离散区间中点mmm
    • 如果mmm在建筑iiixxx范围内,则检查是否存在比iii更靠南(yyy更小)且高度不小于iii的建筑也覆盖该中点;
    • 若存在这样的建筑,则该中点被遮挡;否则该中点可见;
    • 只要有一个中点可见,建筑iii即为可见。
  4. 输出:按题目要求的顺序输出可见建筑的编号。

代码

// Urban Elevations// UVa ID: 221// Verdict: Accepted// Submission Date: 2018-12-27// UVa Run Time: 0.000s//// 版权所有(C)2018,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;// 建筑物结构体structbuilding{intindex;// 建筑物编号doubleleft,bottom,width,depth,height;// 坐标和尺寸// 排序规则:按 x 坐标升序,x 相同时按 y 坐标升序booloperator<(constbuilding&b)const{if(left!=b.left)returnleft<b.left;returnbottom<b.bottom;}};intmain(){intn,cases=0;while(cin>>n,n){vector<building>bs(n);// 存储所有建筑物vector<double>xs;// 存储所有 x 坐标边界// 读入数据for(inti=0;i<n;i++){cin>>bs[i].left>>bs[i].bottom>>bs[i].width>>bs[i].depth>>bs[i].height;bs[i].index=i+1;// 编号从 1 开始xs.push_back(bs[i].left);// 收集左边界xs.push_back(bs[i].left+bs[i].width);// 收集右边界}// 输出格式控制:两个测试用例之间输出空行if(cases++)cout<<'\n';// 输出地图标题cout<<"For map #"<<cases;cout<<", the visible buildings are numbered as follows:\n";// 排序建筑物sort(bs.begin(),bs.end());// 坐标离散化:排序并去重sort(xs.begin(),xs.end());xs.erase(unique(xs.begin(),xs.end()),xs.end());// 遍历所有建筑物,判定可见性for(inti=0,printed=0;i<n;i++){boolvisible=false;// 遍历每个离散区间(取中点代表整个区间)for(intj=0;j<xs.size()-1;j++){doublemiddle=(xs[j]+xs[j+1])/2;// 区间中点// 检查中点是否在当前建筑物的 x 范围内if(bs[i].left<=middle&&bs[i].left+bs[i].width>=middle){boolcovered=false;// 检查是否有更靠南且更高的建筑物覆盖该中点for(intk=0;k<n;k++)// 建筑物 k 覆盖该中点if(bs[k].left<=middle&&bs[k].left+bs[k].width>=middle)// 建筑物 k 更靠南且高度不低于当前建筑物if(bs[k].bottom<bs[i].bottom&&bs[k].height>=bs[i].height){covered=true;break;}// 如果没有被遮挡,则当前建筑物可见if(!covered){visible=true;break;}}}// 输出可见建筑物的编号if(visible){if(printed++)cout<<' ';cout<<bs[i].index;}}cout<<'\n';}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 4:01:35

基于MCP协议构建自动化特许经营尽职调查工具:原理、实践与避坑指南

1. 项目概述&#xff1a;一个为特许经营尽职调查赋能的MCP工具最近在和一些做连锁品牌拓展的朋友聊天&#xff0c;发现他们最头疼的环节之一就是“尽职调查”。这活儿听起来高大上&#xff0c;但实际操作起来&#xff0c;就是海量的信息搜集、整理、比对和分析。一个区域市场有…

作者头像 李华
网站建设 2026/5/15 4:01:00

Java 21 开发视角下的 IPv6 路由协议:静态路由与动态路由解析

Java 21 开发视角下的 IPv6 路由协议&#xff1a;静态路由与动态路由解析 一、IPv6 路由基础 IPv6 地址空间巨大&#xff0c;提供了近乎无限的地址资源&#xff0c;解决了 IPv4 地址枯竭的问题。在 IPv6 网络中&#xff0c;数据包的转发依赖于路由机制&#xff0c;即路由器根据…

作者头像 李华
网站建设 2026/5/15 3:59:37

Bebas Neue开源字体实战指南:3个维度提升你的设计系统商业价值

Bebas Neue开源字体实战指南&#xff1a;3个维度提升你的设计系统商业价值 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue Bebas Neue是一款基于SIL Open Font License 1.1开源协议的现代几何无衬线字体&#xf…

作者头像 李华
网站建设 2026/5/15 3:51:14

3分钟免费搞定百度网盘秒传:永久分享大文件的终极解决方案

3分钟免费搞定百度网盘秒传&#xff1a;永久分享大文件的终极解决方案 【免费下载链接】rapid-upload-userscript-doc 秒传链接提取脚本 - 文档&教程 项目地址: https://gitcode.com/gh_mirrors/ra/rapid-upload-userscript-doc 你是否厌倦了百度网盘分享链接频繁失…

作者头像 李华
网站建设 2026/5/15 3:51:11

JTAG IDCODE与SWD协议:嵌入式调试核心技术解析

1. JTAG IDCODE机制深度解析在嵌入式系统调试领域&#xff0c;JTAG IDCODE是调试器识别目标设备的核心机制。这个32位寄存器就像设备的"身份证"&#xff0c;包含了三个关键信息字段&#xff1a;VERSION&#xff08;位[31:28]&#xff09;&#xff1a;设备版本代码&am…

作者头像 李华