Acwing算法心得——猜测短跑队员的速度(重写比较器)

news2025/1/18 3:24:49

大家好,我是晴天学长,今天的算法题用到了比较器的知识,是经常会用到的一个知识点,常见与同种数据的排序,需要的小伙伴请自取哦!如果觉得写的不错的话,可以点个关注哦,后续会继续更新的。💪💪💪


1 )猜测短跑队员的速度

在这里插入图片描述
一个短跑运动员在一个数轴上跑步。 他的奔跑速度是恒定的,但是奔跑方向可能会不断发生改变,有时朝数轴正方向,有时朝数轴负方向。 给定 N 个不同时刻下他所在的位置,请你计算他的速度至少是多少。

输入格式
第一行包含整数 N。

接下来 N 行,每行包含两个整数 T 和 X,表示时刻 T 时,运动员位于位置 X。

注意,输入时刻两两不同,但是不一定按时间顺序给出。

输出格式
一个实数,表示运动员的最小可能速度。

输出结果与标准答案的相对误差小于 10−5 即视为正确。
数据范围
2≤N≤105, 0≤T≤109, −109≤X≤109
输入样例1:
3 0 100 20 50 10 120
输出样例1:
7.0
样例1解释
运动员时刻 0 在位置 100,10 秒后,他位于位置 120,由此可知,他的速度一定不低于 (120−100)/10=2,又过了 10 秒,他位于位置 50,由此可知,它的速度一定不低于 (120−50)/10=7。

输入样例2:
5 20 -5 0 -17 10 31 5 -3 30 11
输出样例2:
6.8


2) .算法思路

答案中的代码是这样的,假设需要排序的数组intervals:

int[][] intervals = {{2,3},{2,9},{4,5},{3,7},{6,7},{8,9},{1,10}};
Arrays.sort(intervals, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        if(o1[0]==o2[0]){
            return o1[1] - o2[1];
        }
        return o1[0] - o2[0];
    }
});

此代码中,对于每个o1和o2数组,若各自第一个元素(也就是o1[0]和o2[0])相等,则按照各自第二个元素进行升序比较,否则就按照第一个元素进行升序比较。

在此,o1[0] - o2[0] 表示升序,o2[0] - o1[0] 表示降序。

比如这个代码,结果如下:

1 10
2 3
2 9
3 7
4 5
6 7
8 9
o1[0]表示第一个元素,以此类推,所以我们想要根据第几个元素排序,就写入就好:

// 按照第三个元素排序
int[][] intervals = {{2,3,4,5},{2,9,7,5},{4,5,1,5},{3,7,1,2},{6,7,3,4}};
Arrays.sort(intervals, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        return o1[2] - o2[2];
    }
});

得到的结果如下:

4 5 1 5
3 7 1 2
6 7 3 4
2 3 4 5
2 9 7 5
另外,他还有其他的写法:

  • 使用Lambda表达式的方式对Comparator比较器进行简写(JDK1.8+)
int[][] intervals = {{2,3,4,5},{2,9,7,3},{4,5,1,5},{3,7,1,2},{6,7,3,4}};
Arrays.sort(intervals, (o1, o2) -> {
    return o1[2] - o2[2];
});

3). 算法步骤

1.导入需要使用的类:Arrays、Comparator和Scanner。
2.创建一个Main类,作为程序的入口点。
3.创建一个Scanner对象,用于读取输入。
4.从输入中读取一个整数N,表示搜索数据的数量。
5.创建一个二维数组search,大小为N×2,用于存储搜索数据。
6.使用循环,读取N个搜索数据,并将它们存储在search数组中。
7.使用Arrays.sort方法对search数组进行排序,根据每个搜索数据的第一个元素进行升序排序。
8.通过创建一个Comparator对象,重写compare方法,指定按照第一个元素的升序排序。
9.或者使用lambda表达式 (o1, o2) -> (o1[0] - o2[0]) 作为排序的比较函数。
10.初始化一个变量min为0,用于存储最大搜索斜率的初始值。
11.使用循环,从数组的第二个元素开始,遍历所有搜索数据。
12.计算两个搜索数据之间的斜率,即当前搜索数据的纵坐标与前一个搜索数据的纵坐标之差除以横坐标的差值。
13.更新min的值,取当前斜率与min的较大值。
14使用System.out.format方法,以保留一位小数的格式输出min的值。
15.程序执行完毕。


4).代码示例

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int [][] search =  new int[N][2];
        for (int i = 0; i < N; i++) {
            search[i][0] = scanner.nextInt();
            search[i][1] = scanner.nextInt();
        }
        //重写排序
//        Arrays.sort(search, (o1, o2) -> (o1[0] - o2[0]));
        Arrays.sort(search,new Comparator<int[]>(){
            @Override
            public int compare(int[] o1, int[] o2) {
               return o1[0] - o2[0];
            }
        });
            double min = 0;
            for (int i = 1; i < N; i++) {
                double x = Math.abs(search[i][1] - search[i-1][1]);
                double t = search[i][0] - search[i - 1][0];
                min = Math.max(min, x / t);
            }
        System.out.format("%.1f", min);
    }
}


5).总结

  • 排序的重写器。

试题链接:

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

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

相关文章

什么是函数式编程(functional programming)?在JavaScript中如何实现函数式编程的概念?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 函数式编程&#xff08;Functional Programming&#xff09;⭐ 纯函数&#xff08;Pure Functions&#xff09;⭐ 不可变性&#xff08;Immutability&#xff09;⭐ 高阶函数&#xff08;Higher-Order Functions&#xff09;⭐ 函数组合&…

jq命令安装与使用

目录 一、简介二、下载及安装1.Linux 安装2.Windows 安装3.测试安装结果 三、jq用法1.基本语法2.常见用法1&#xff09;格式化 JSON2&#xff09;获取属性3&#xff09;属性不存在情况处理4&#xff09;数组遍历、截取、展开5&#xff09;管道、逗号、加号6&#xff09;数据构造…

长话短说 CopyOnWrite 思想及其应用场景

长话短说 CopyOnWrite 思想及其应用场景。 CopyOnWrite(写入时复制)思想 CopyOnWrite(简称COW,中文意思是:写入时复制)就是在进行写操作时,先复制要改变的对象,对副本进行写操作,完成对副本的操作后,把原有对象的引用指向副本对象。 CopyOnWrite采用了读写分离的思想…

Day45:Element-Plus

Vue生态中包含了大量优秀的组件库&#xff0c;经过快速的学习&#xff0c;我们就能把这些现成的组件应用到自己的项目中了 1.常见组件库 UI组件库需要基于JS框架来实现&#xff0c;也就是说我们现在学习的是Vue3&#xff0c;也需要选择适配的组件库&#xff0c;在Vue生态中&a…

C++QT day6

1> 将之前定义的栈类和队列类都实现成模板类 栈&#xff1a; #include <iostream> #define MAX 128 using namespace std; template<typename T> class Stack_s { private:T *pnew T[MAX];//栈的数组int top;//记录栈顶的变量 public://构造函数Stack_s(int t…

数据结构--平衡二叉树

目录 平衡二叉树定义 平衡二叉树的插入 调整最小不平衡子树 LL型 RR型 LR型​编辑 RL型​编辑 练习 查找效率分析​编辑 回顾知识点 平衡二叉树的删除 例1 ​编辑 例2​编辑 例3 例4​编辑 ​编辑 平衡二叉树的删除回顾​编辑 定义插入操作插入新结点后如何调…

SoundSource 5 for Mac:专业音频控制器,让您的Mac听觉体验更出色

对于使用 Mac 的用户而言&#xff0c;拥有一个强大的音频控制工具是非常重要的。SoundSource 5 for Mac 是 Rogue Amoeba 公司开发的一款专业的音频控制器&#xff0c;它提供了丰富的功能和优秀的性能&#xff0c;让您能够轻松管理并优化Mac上的音频设置。 首先&#xff0c;So…

腾讯mini项目-【指标监控服务重构】2023-08-12

今日已办 Watermill Handler 将 4 个阶段的逻辑处理定义为 Handler 测试发现&#xff0c;添加的 handler 会被覆盖掉&#xff0c;故考虑添加为 middleware 且 4 个阶段的处理逻辑针对不同 topic 是相同的。 参考https://watermill.io/docs/messages-router/实现不同topic&am…

DS相关题目

DS相关题目 题目一&#xff1a;消失的数字 拿到这道题目之后&#xff0c;首先可以想到的一个解题方法就是&#xff0c;我们可以先排序&#xff0c;排完序之后&#xff0c;这个数组其实就是一个有序的数组了&#xff0c;那只用比较数组中的每一个元素和他对应的下标是不是相等的…

Day46-50:统计图表项目总结

建项 项目需求写法——可视化报表 可视化报表项目效果 开源表格样式库阿帕奇 绘制echarte图标的流程 在视图中放置一个容器&#xff0c;这个容器需要有一个固定的宽高获取容器&#xff0c;调用init方法&#xff0c;初始化echarts实例 let container document.querySelec…

stm32----ADC模数转换

一、ADC介绍 ADC&#xff0c;即模数转换器&#xff0c;它可以将模拟信号转化为数字信号。在stm32种一般有3个ADC&#xff0c;每个ADC有18个通道。 12位ADC是一种逐次逼近型模拟数字转换器&#xff0c;它有多达18个通道&#xff0c;可测量16个外部和两个内部信号源。各个通道的A…

jquery设置图片可手动拖拽

JQuery是一款流行的JavaScript框架&#xff0c;可以轻松实现网页交互效果。而其中一种常见效果是图片手动拖拽。以下是设置图片手动拖拽的JQuery代码。 $(document).ready(function() { var isDragging false; var mousePos { x: 0, y: 0 }; var elemPos { x: 0, y: 0 }; v…

Apache Spark 在爱奇艺的应用实践

01 Apache Spark 在爱奇艺的现状 Apache Spark 是爱奇艺大数据平台主要使用的离线计算框架&#xff0c;并支持部分流计算任务&#xff0c;用于数据处理、数据同步、数据查询分析等场景&#xff1a; 数据处理&#xff1a;在数据开发平台中支持开发者提交 Spark Jar 包任务或Spar…

elasticsearch2-es和kibana的安装

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;三人行&#xff0c;必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》&#xff0c;SpringCloud…

第 113 场 LeetCode 双周赛题解

A 使数组成为递增数组的最少右移次数 数据范围小直接模拟… class Solution { public:int minimumRightShifts(vector<int> &nums) {for (int op 0; op < nums.size(); op) {if (is_sorted(nums.begin(), nums.end()))//nums是否已经有序return op;rotate(nums.b…

zerotier-client

title: “zerotier-client” createTime: 2022-10-10T11:50:5108:00 updateTime: 2022-10-10T11:50:5108:00 draft: false author: “zcb” tags: [“zerotier-plant”,“zerotier-client”,“zerotier”] categories: [“zerotier”] description: “测试的” 1.windows 1.1…

【深度学习】Pytorch 系列教程(十二):PyTorch数据结构:4、数据集(Dataset)

目录 一、前言 二、实验环境 三、PyTorch数据结构 0、分类 1、张量&#xff08;Tensor&#xff09; 2、张量操作&#xff08;Tensor Operations&#xff09; 3、变量&#xff08;Variable&#xff09; 4、数据集&#xff08;Dataset&#xff09; 随机洗牌 一、前言 Ch…

【Windows】搭建 FTP 服务器

如果需要开发ftp文件上传下载等功能&#xff0c;就需要搭建个ftp服务器&#xff0c;方便调试。 FTP服务 FTP是文件传输协议&#xff08;File Transfer Protocol&#xff09;的简称&#xff0c;该协议属于应用层协议&#xff08;端口号通常为21&#xff09;&#xff0c;用于In…

【入门篇】ClickHouse最优秀的开源列式存储数据库

文章目录 一、什么是ClickHouse&#xff1f;OLAP场景的关键特征列式数据库更适合OLAP场景的原因输入/输出CPU 1.1 ClickHouse的定义与发展历程1.2 ClickHouse的版本介绍 二、ClickHouse的主要特性2.1 高性能的列式存储2.2 实时的分析查询2.3 高度可扩展性2.4 数据压缩2.5 SQL支…

骨传导耳机有害处吗、骨传导耳机真的不好用吗?

骨传导耳机没有害处。 骨传导耳机是通过将声音传递到颅骨&#xff0c;再由颅骨传递到内耳&#xff0c;从而达到听声音的效果&#xff0c;与传统的耳机不同。 因此&#xff0c;骨传导耳机不会直接对人的身体健康、耳朵产生压力和损伤&#xff0c;也不会影响耳道和中耳的正常功能…