【洛谷 P1105】平台 题解(结构体排序+枚举)

news2024/10/11 18:20:42

平台

题目描述

空间中有一些平台。给出每个平台的位置,请你计算从每一个平台的边缘落下之后会落到哪一个平台上。注意,如果某两个平台的某个两边缘横坐标相同,物体从上面那个平台落下之后将不会落在下面那个平台上。平台可能会重叠

如果有两个平台的高度相同且都可以被落到的话,那么会落到编号靠前的那个平台。

输入格式

第一行有一个数 N N N 表示平台的个数;

接下来 N N N 行每行三个整数 分别是平台的高度 H i H_i Hi,左端点的 X X X 坐标 L i L_i Li,右端点的 X X X 坐标 R i R_i Ri

其中, 1 ≤ N ≤ 10 3 1 \le N \le {10}^3 1N103 0 ≤ H , L , R ≤ 2 × 10 4 0 \le H,L,R \le 2 \times {10}^4 0H,L,R2×104

输出格式

输出共 N N N 行,每行两个数,分别表示:

从第 i i i 个平台的左边缘落下后到达的平台序号和右边缘落下以后到达的平台序号。

输入数据中第一个平台的序号是 1 1 1。如果某个平台的某个边缘下面没有平台了,输出 0 0 0

样例 #1

样例输入 #1

5
2 0 2
4 1 3
3 1 3
5 3 4
1 1 5

样例输出 #1

0 5
1 5
1 5
5 5
0 0

提示


思路

给定一些平台的高度、左右边缘坐标,求出每个平台落地时会落在哪个平台上。

定义了一个S结构体,表示平台的高度、左右边缘坐标和编号。使用sort函数对平台按照高度进行降序排序,然后对每个平台进行处理,求出它落地时会落在哪个平台上。

定义了一个cmp函数,用于对平台进行排序。如果两个平台的高度相同,则将编号小的放在前面,否则按照高度降序排列。

对于每个平台,首先初始化左右边缘的落点和高度,然后从当前平台的下一个平台开始遍历,判断左边缘和右边缘是否可以落到,如果可以则更新对应的落点。最后将每个平台的落点存入到一个pair数组中,按顺序输出即可。

注意:平台可能重叠。如果有两个平台的高度相同且都可以被落到的话,那么会落到编号靠前的那个平台。


AC代码

#include <iostream>
#include <algorithm>
#define AUTHOR "HEX9CF"
using namespace std;

const int maxn = 100005;

struct S
{
    int id;
    int h;
    int l;
    int r;
} p[maxn];

// 如果有两个平台的高度相同且都可以被落到的话,那么会落到编号靠前的那个平台。
bool cmp(S x, S y)
{
    return (x.h == y.h) ? (x.id < y.id) : (x.h > y.h);
}

int main()
{
    int n;
    pair<int, int> ans[maxn];
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> p[i].h >> p[i].l >> p[i].r;
        p[i].id = i;
    }
    sort(p + 1, p + 1 + n, cmp);
    for (int i = 1; i <= n; i++)
    {
        int dl, dr;
        int hl, hr;
        // 初始落点
        dl = dr = 0;
        for (int j = i + 1; j <= n; j++)
        {
            // 左边缘落下
            if (p[j].l < p[i].l && p[i].l < p[j].r && p[j].h < p[i].h)
            {
                dl = p[j].id;
                break;
            }
        }
        for(int j = i + 1; j <= n; j++) {
            // 右边缘落下
            if (p[j].l < p[i].r && p[i].r < p[j].r && p[j].h < p[i].h)
            {
                dr = p[j].id;
                break;
            }
        }
        // cout << dl << " " << dr << endl;
        ans[p[i].id] = make_pair(dl, dr);
    }
    for (int i = 1; i <= n; i++)
    {
        cout << ans[i].first << " " << ans[i].second << endl;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/993206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot 异常 #Class path contains multiple SLF4J bindings.警告解决

1.异常现象 启动 Maven 项目时&#xff0c;抛出警告信息&#xff1a; 2.排查分析 从报出来的警告信息来看&#xff0c;大致意思是&#xff0c;pom.xml 引入的包 slf4j-log4j12-1.7.20.jar 和包 logback-classic-1.1.7.jar 中&#xff0c;都找到了 /org/slf4j/impl/StaticLogger…

Arrays.copyOf 和System.arraycopy?深拷贝和浅拷贝?

Arrays.copyOf 和 System.arraycopy 1&#xff09;二者有何不同&#xff1f; System.arraycopy()方法 System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length); 需主动创建目标对象dest可定义起始元素&#xff0c;灵活拷贝元素比较重要的一点&…

TCP IP网络编程(五) 基于TCP的服务器端、客户端 (补充)

文章目录 回声客户端的完美实现回声客户端出现的问题回声客户端问题解决方法 TCP原理TCP套接字中的I/O缓冲TCP内部工作原理1&#xff1a;与对方套接字的连接TCP内部工作原理2&#xff1a;与对方主机的数据交换TCP内部工作原理3&#xff1a;断开与套接字的连接 总结 回声客户端的…

CRM软件管理系统的基本功能

CRM管理系统是企业运营的重要工具&#xff0c;它可以帮助企业管理客户关系&#xff0c;提升销售效率&#xff0c;大幅提高客户转化率&#xff0c;实现业绩增长。那么&#xff0c;CRM管理系统一般包含哪些功能呢&#xff1f;下面我们就来说说。 1、销售自动化 销售自动化顾名思…

【面试专题】Spring篇②

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;Java面试专题 目录 1.spring-bean的循环依赖 2.springMVC执行流程 3.Springboot自动配置原理 4.Spring框架常见的注解&#xff08;Spring&#xff0c;SpringMVC&#xff0c;SpringBoot&#x…

Ubuntu编译运行socket.io

本篇文章记录一下自己在ubuntu上编译运行socket.io的过程&#xff0c;客户端选用的是socket.io的c的库&#xff0c;编译起来倒不难&#xff0c;但是说到运行的话&#xff0c;对我来说确实是花了点功夫。毕竟程序要能运行起来才能更方便地去熟悉代码&#xff0c;因此今天我就记录…

MySQL——日志

日志的作用 1.用来排错 2.用来做数据分析 3.了解程序的运行情况&#xff0c;是否健康--》了解MySQL的性能&#xff0c;运行情况 分类 mysql很多有类型的日志&#xff0c;按照组件划分的话&#xff0c;可以分为 服务层日志 和 存储引擎层日志 &#xff1a; - 服务层…

数据治理-数据建模和设计

是什么&#xff1f; 数据建模是发现、分析和确定数据需求的过程&#xff0c;用一种称为数据模型的精确形式表示和传递这些数据需求。数据建模是数据管理的一个重要组成部分。建模过程中要求组织发现并记录数据组合的方式。 数据可以采用多种不同的模式来表示&#xff0c;其中最…

【广州华锐互动】电厂三维数字孪生大屏的功能和优势

在工业互联网的背景下&#xff0c;电厂三维数字孪生大屏系统正在逐渐成为电力行业的重要技术。通过创建电厂的虚拟模型&#xff0c;这个数字孪生系统可以实现对实际电厂的实时监控&#xff0c;预测维护需求&#xff0c;优化运营效率&#xff0c;甚至在某些情况下&#xff0c;能…

CrossEntropyLoss() 和 nn.BCEWithLogitsLoss() 举例说明区别

CrossEntropyLoss() 通常用于多分类任务&#xff0c;它接受一个包含类别标签的张量作为目标值&#xff0c;并且假设每个样本只属于一个类别。在多分类任务中&#xff0c;模型的最后一层输出是一个概率分布&#xff0c;表示每个类别的概率。CrossEntropyLoss() 计算模型输出与目…

微信“刷掌支付”上线,扫手就可以付款!你知道怎么开通了吗?

不用扫码&#xff01;不用刷卡&#xff01;隔空感应&#xff01; 刷掌就能支付 没错&#xff01; 新科技来咯~ 刷 掌 早在今年5月&#xff0c;微信刷掌支付正式面世&#xff0c;目前已应用于交通、健身、校园、零售、餐饮、办公、共享充电等多个场景&#xff0c;如北京地铁…

vue3+ts项目打包后的本地访问

注意&#xff1a;打包之后不可直接点击html访问&#xff0c;需要给项目安装本地服务&#xff01; 1、安装servenpm i -g serve 2、打包项目npm run build 生成dist文件夹 3、本地访问serve dist 运行service dist之后的控制台 可复制下方的地址运行打包后的项目&#xff0c;运行…

Spring系列文章:Spring中的设计模式

一、简单⼯⼚模式 BeanFactory的getBean()⽅法&#xff0c;通过唯⼀标识来获取Bean对象。是典型的简单⼯⼚模式&#xff08;静态⼯⼚模 式&#xff09;&#xff1b; 二、⼯⼚⽅法模式 FactoryBean是典型的⼯⼚⽅法模式。在配置⽂件中通过factory-method属性来指定⼯⼚⽅法&a…

英语单词(二)

1.int:整形 2.char:字符型 3.scanner:接受输入,扫描器 4.integer:整数,整形 5.type:类型 6.string:字符串类型 7.double:双精度浮点型

OpenRoads地形模型添加(增补)地形点

创建三维点&#xff0c;将创建的点对象添加到现有地形模型。 在ORD建模工作流&#xff1a; 地形、分析、点、分析点&#xff0c;在需要添加点的位置读出地模的高程&#xff08;图1&#xff09;&#xff1b; 图1 几何、平面、点添加高程点&#xff0c;特征设为地形随机点、高…

双线性插值以及计算

参考视频&#xff1a;图像处理-双线性插值_哔哩哔哩_bilibili 双线性插值 双线性插值是一种常用的图像处理和计算机图形学技术&#xff0c;用于在离散像素网格上平滑地估算介于两个相邻像素之间的数值。这种插值方法通常用于图像放大、旋转和变换等操作&#xff0c;以改善图像…

操作系统 第二章 进程管理:进程与线程、处理机调度

目录 1.进程与线程 1.1进程的概念、组成、特征 1.1.1概念 1.1.2组成 进程控制块&#xff08;PCB&#xff09; 程序段 数据段 1.1.3特征 1.2进程的状态与转换 1.2.1进程的五种状态 1.2.2进程的状态转换 1.3进程控制 1.3.1如何实现原语的“原子性” 1.3.2进程的创建…

intellij debug模式提示 : Method breakpoints may dramatically slow down debugging

最近在搞一个搭建一个项目 , 项目搭建完之后发现启动不了 , 一直都是正在加载中 并且提示Method breakpoints may dramatically slow down debugging&#xff0c;百度之后才知道是打了方法断点的原因 , 之前不小心打了一个断点 解决办法 : 点击如下图所示的按钮 然后把有断点…

15:00面试,15:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

matlab之cell数组的详细用法

一、cell数组是什么&#xff1f; 在MATLAB中&#xff0c;Cell数组是一种特殊的数据结构&#xff0c;它可以存储不同类型的数据&#xff0c;包括数字、字符串、数组、结构体等。Cell数组是一种灵活的数据容器&#xff0c;可以方便地存储和处理不同类型的数据。 二、怎么使用ce…