数据结构刷题 -- 客房预约

1. 题目描述

您需要实现一个功能,快速找到客户想要的酒店房间。
在系统中注册的酒店数量N,最多为1000家。
酒店ID的值介于1和N之间。这些值彼此不同。
每家旅馆最多有100个房间。
每个房间的ID值介于1和100000之间。给定值彼此不同。
(但是,酒店ID和房间ID的值可以相同。)每个房间都有以下信息:
Region (1 ~ 10)
Number of Beds (2 ~ 10)
Room Type	(1 ~ 4)
View Type (1 ~ 4)
Initial Price	(10,000 ~ 20,000)酒店客房搜索系统会返回与客户选择的过滤器选项匹配的房间中最便宜的房间。
客户输入的信息如下:
Check-in Date (1 ~ 9,999)
Check-out Date (Check-in Date +1 ~ 10,000)
Region (1 ~ 10)
Number of Beds (2 ~ 10)
Room Type (1 ~ 4)
View Type (1 ~ 4)请实现以下API:
void init(int N, int mRoomCnt[])
此函数在每个测试用例开始时调用一次。
参数
N:酒店数量(1 ≤ N≤ 1,000)
mRoomCnt[]:每个酒店的客房数量。该值大于或等于1,但最多为100。
mRoomCnt[k]是酒店ID为k+1的酒店的房间数。(0 ≤ k ≤ N-1)void addRoom(int mHotelID, int mRoomID, int mRoomInfo[])
此功能可在酒店中添加新房间。
将添加房间的酒店ID的值为mHotelID。
要添加的房间ID的值为mRoomID。
mRoomInfo是关于将添加的房间的信息。
mRoomInfo是一个长度为5的数组。每个索引包含以下值。
[0]:Region
[1]:Number of Beds
[2]:Room Type
[3]:View Type
[4]:Price
每个阵列的值满足本文所述的约束。
保证要添加的房间数量不超过从init()传递的房间数量。
参数
mHotelID:将添加房间的酒店ID(1≤ mHotelID≤ N)
mRoomID:房间ID(1≤ 米隆≤ 100,000 )
mRoomInfo:房间信息int findRoom(int mFilter[])
此功能用于查找和预订房间。
mFilter是一个包含筛选器选项的数组。
[0]:Check-in Date
[1]:Check-out Date
[2]:Region
[3]:Number of Beds
[4]:Room Type
[5]:View Type 每个阵列的值满足本文所述的约束。
您不能预订从入住日期到退房日期已经被预订的房间。
但是,其他客户也可以在退房日期入住。
在匹配过滤器选项的房间中,预订最便宜的房间。
价格相同时,选择ID值最小的房间。
此函数返回已预订房间的ID值。
当没有可预订的房间时,此函数返回-1。
参数
mFilter:房间的过滤器选项
Return
已预订房间的ID值int riseCosts(int mHotelID)
该功能将酒店所有房间的价格提高10%。
计算时,删除小数。例如:房价15374提高10%,15374 + 1537 = 16911
参数
mHotelID:价格上涨的酒店ID(1≤ mHotelID≤ N)
Return
该酒店所有房间的价格总和

 

2. api调用次数

[Constraints]
1. N, the number of hotels, is 1,000 at maximum.
2. init() is called once in the very beginning of each test case.
3. addRoom() is called all at once after init() and is no longer called after findRoom() or riseCosts() is called.
4. The number of rooms in each hotel is 100 at most.
5. findRoom() is called up to 10,000 times.
6. riseCosts() is called up to 500 times.

 

 

3. 单个测试数据

1 100
3 2 6 10 
100 1 1 2 2 2 1 14629
100 1 2 2 3 1 2 10203
100 2 3 2 3 1 1 15374
100 2 4 1 2 2 1 10795
100 2 5 2 2 1 2 17701
100 2 6 1 3 2 2 13757
100 2 7 1 3 1 2 13569
100 2 8 1 3 2 2 17424
100 3 9 1 3 2 1 18267
100 3 10 2 3 1 2 11378
100 3 11 1 3 1 1 11800
100 3 12 2 3 2 2 16613
100 3 13 1 3 2 1 13157
100 3 14 2 3 1 2 10064
100 3 15 1 3 2 1 12999
100 3 16 1 3 1 2 13642
100 3 17 2 2 2 2 14388
100 3 18 2 2 2 2 16089
200 7 11 2 3 1 2 14
200 4 9 2 3 2 1 -1
200 12 13 2 3 1 2 14
200 21 25 1 2 2 2 -1
200 21 24 2 2 1 2 5
200 9 13 1 2 1 2 -1
300 2 97479
200 27 31 1 2 2 2 -1
300 2 107225
200 16 17 1 3 2 2 6
200 8 11 2 3 1 2 2
200 18 20 2 2 1 2 5
200 9 10 2 3 2 1 -1
200 22 27 2 3 2 2 12
200 27 31 1 3 1 1 11
200 24 25 1 3 1 2 16
300 3 152231
200 4 7 1 2 2 1 4
200 9 13 2 2 1 1 -1
200 14 17 2 2 1 1 -1
400

 

4. 主类

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;class Solution {private static UserSolution user = new UserSolution();private static int roomCnt[] = new int[1005];private static final int ADDROOM = 100;private static final int FINDROOM = 200;private static final int RISECOSTS = 300;private static final int END = 400;private static int hotelID = 0;private static int roomID = 0;private static int roomInfo[] = new int[5];private static int filterInfo[] = new int[6];private static int run(BufferedReader br, int _score) throws Exception{int score = _score;StringTokenizer st = new StringTokenizer(br.readLine(), " ");int n = Integer.parseInt(st.nextToken());for (int i = 0; i < n; i++)roomCnt[i] = Integer.parseInt(st.nextToken());user.init(n, roomCnt);int cmd, user_ans, correct_ans;for(int q = 0;;q++){st = new StringTokenizer(br.readLine(), " ");cmd = Integer.parseInt(st.nextToken());switch (cmd){case ADDROOM:hotelID = Integer.parseInt(st.nextToken());roomID = Integer.parseInt(st.nextToken());for (int i = 0; i < 5; i++)roomInfo[i] = Integer.parseInt(st.nextToken());user.addRoom(hotelID, roomID, roomInfo);break;case FINDROOM:for (int i = 0; i < 6; i++)filterInfo[i] = Integer.parseInt(st.nextToken());user_ans = user.findRoom(filterInfo);correct_ans = Integer.parseInt(st.nextToken());if (user_ans != correct_ans)score = 0;break;case RISECOSTS:hotelID = Integer.parseInt(st.nextToken());user_ans = user.riseCosts(hotelID);correct_ans = Integer.parseInt(st.nextToken());if (user_ans != correct_ans)score = 0;break;case END:return score;default:score = 0;break;}}}public static void main(String[] args) throws Exception {
//		System.setIn(new java.io.FileInputStream("res/sample_input.txt"));BufferedReader br = new BufferedReader(new InputStreamReader(System.in));StringTokenizer st = new StringTokenizer(br.readLine(), " ");int tc = Integer.parseInt(st.nextToken());int score = Integer.parseInt(st.nextToken());for (int t = 1; t <= tc; t++){System.out.println("#"+ t + " " + run(br, score));}br.close();}}

5. 需要实现的api

class UserSolution
{void init(int N, int mRoomCnt[]){}void addRoom(int mHotelID, int mRoomID, int mRoomInfo[]){}int findRoom(int mFilter[]){return 0;}int riseCosts(int mHotelID){return 0;}
}

6. 目前实现的代码(10s多)

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.TreeSet;class UserSolution
{class Hotel {int nums;TreeSet<Room> queue = new TreeSet<>(new MyComparator());Hotel(int nums) {this.nums = nums;}}class Room {int roomId;int reigon;int beds;int roomType;int viewType;int price;List<UserDate> userDate = new ArrayList<>();Room (int roomId, int reigon, int beds, int roomType, int viewType, int price) {this.roomId = roomId;this.reigon = reigon;this.beds = beds;this.roomType = roomType;this.viewType = viewType;this.price = price;}}class UserDate {int start;int end;UserDate(int start, int end) {this.start = start;this.end = end;}}class MyComparator implements Comparator<Room> {@Overridepublic int compare(UserSolution.Room o1, UserSolution.Room o2) {if (o1.price == o2.price) {return o1.roomId - o2.roomId;}return o1.price - o2.price;}}HashMap<Integer, Room> roomMap = new HashMap<>();Hotel[] hotels;int n;void init(int N, int mRoomCnt[]){n = N + 1;hotels = new Hotel[n];roomMap.clear();for (int i = 0; i < n; i++) {hotels[i] = new Hotel(mRoomCnt[i]);}}void addRoom(int mHotelID, int mRoomID, int mRoomInfo[]){Room room = new Room(mRoomID, mRoomInfo[0], mRoomInfo[1], mRoomInfo[2], mRoomInfo[3], mRoomInfo[4]);roomMap.put(mRoomID, room);hotels[mHotelID].queue.add(room);}int findRoom(int mFilter[]){int findId = -1;int minPrice = Integer.MAX_VALUE;for (Hotel hotel : hotels) {TreeSet<Room> queue = hotel.queue;for (Room room : queue) {if (check(room, mFilter)) {if (room.price < minPrice) {minPrice = room.price;findId = room.roomId;}break;}}}if (findId != -1) {roomMap.get(findId).userDate.add(new UserDate(mFilter[0], mFilter[1]));}return findId;}boolean check(Room room, int[] mFilter) {if (mFilter[2] != room.reigon) {return false;}if (mFilter[3] != room.beds) {return false;}if (mFilter[4] != room.roomType) {return false;}if (mFilter[5] != room.viewType) {return false;}for (UserDate userDate : room.userDate) {if (mFilter[0] >= userDate.start && mFilter[1] <= userDate.end) {return false;}if (mFilter[0] >= userDate.start && mFilter[0] < userDate.end && mFilter[1] > userDate.end) {return false;}if (mFilter[0] < userDate.start && mFilter[1] > userDate.start && mFilter[1] <= userDate.end) {return false;}if (mFilter[0] < userDate.start && mFilter[1] > userDate.end) {return false;}}return true;}int riseCosts(int mHotelID){int maxValue = 0;TreeSet<Room> newQueue = new TreeSet<>(new MyComparator());for (Room room : hotels[mHotelID].queue) {Room newRoom = room;newRoom.price += room.price * 0.1;newQueue.add(newRoom);maxValue += room.price;}hotels[mHotelID].queue.clear();hotels[mHotelID].queue = newQueue;return maxValue;}}

 

 

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

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

相关文章

Linux第42步_移植ST公司uboot的第3步_uboot命令测试,搭建nfs服务器和tftp服务器

测试uboot命令&#xff0c;搭建nfs服务器和tftp服务器&#xff0c;是测试uboot非常关键的一步。跳过这一节&#xff0c;后面可能要踩坑。 一、输入“help回车”&#xff0c;查询uboot所支持的命令 二、输入“? bootz回车”&#xff0c;查询“bootz”怎么用 注意&#xff1a;和…

如何正确理解和获取S参数

S参数是网络参数&#xff0c;定义了反射波和入射波之间的关系&#xff0c;给定频率的S参数矩阵指定端口反射波b的矢量相对于端口入射波a的矢量&#xff0c;如下所示&#xff1a; bS∙a 在此基础上&#xff0c;如下图所示&#xff0c;为一个常见的双端口网络拓扑图&#xff1a;…

【RK3399 Android10, 支持温控风扇】

文章目录 【RK3399 Android10, 支持温控风扇】需求描述patch 【RK3399 Android10, 支持温控风扇】 需求描述 3399 Android10 的风扇&#xff0c;希望能做成温度控制的风扇&#xff0c;通过设置不同测温度阈值来实行不同的风速 patch kernel 0020-feat-rochchip-system-mon…

git如何在忘记pull的情况下push了代码导致的冲突

在忘记pull的情况下push代码导致冲突时&#xff0c;可以按照以下步骤解决问题&#xff1a; 首先&#xff0c;确认你的本地分支和远程分支之间存在冲突。可以通过执行git status命令查看冲突文件列表。 确定冲突文件后&#xff0c;打开这些文件并找到冲突的部分。冲突的部分会以…

go-carbon v2.3.8 发布,轻量级、语义化、对开发者友好的 golang 时间处理库

carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库&#xff0c;支持链式调用。 目前已被 awesome-go 收录&#xff0c;如果您觉得不错&#xff0c;请给个 star 吧 github.com/golang-module/carbon gitee.com/golang-module/carbon 安装使用 Golang 版本大于…

【算法题】93. 复原 IP 地址

题目 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址&#xff0c;但是 "0.011…

红队打靶练习:HEALTHCARE: 1

目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb 目录探测 1、gobuster 2、dirsearch WEB web信息收集 gobuster cms sqlmap 爆库 爆表 爆列 爆字段 FTP 提权 信息收集 本地提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Inte…

LoRA:语言模型微调的计算资源优化策略

编者按&#xff1a;随着数据量和计算能力的增加&#xff0c;大模型的参数量也在不断增加&#xff0c;同时进行大模型微调的成本也变得越来越高。全参数微调需要大量的计算资源和时间&#xff0c;且在进行切换下游任务时代价高昂。 本文作者介绍了一种新方法 LoRA&#xff0c;可…

Java LinkedList 实现栈和队列

Java LinkedList 实现栈和队列 package com.zhong.collection;import java.util.LinkedList;public class LinkedListDemo {public static void main(String[] args) {// LinkedList 创建一个队列LinkedList<String> queue new LinkedList<>();// 进队System.out…

2024年【A特种设备相关管理(电梯)】考试题及A特种设备相关管理(电梯)模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 A特种设备相关管理&#xff08;电梯&#xff09;考试题是安全生产模拟考试一点通生成的&#xff0c;A特种设备相关管理&#xff08;电梯&#xff09;证模拟考试题库是根据A特种设备相关管理&#xff08;电梯&#xff…

BC107 矩阵转置

描述 KiKi有一个矩阵&#xff0c;他想知道转置后的矩阵&#xff08;将矩阵的行列互换得到的新矩阵称为转置矩阵&#xff09;&#xff0c;请编程帮他解答。 输入描述&#xff1a; 第一行包含两个整数n和m&#xff0c;表示一个矩阵包含n行m列&#xff0c;用空格分隔。 (1≤n≤…

UML之在Markdown中使用Mermaid绘制类图

1.UML概述 UML&#xff08;Unified modeling language UML&#xff09;统一建模语言&#xff0c;是一种用于软件系统分析和设计的语言工具&#xff0c;它用于帮助软件开发人员进行思考和记录思路。 类图是描述类与类之间的关系的&#xff0c;是UML图中最核心的。类图的是用于…

【Java数据结构】单向 不带头 非循环 链表实现

模拟实现LinkedList&#xff1a;下一篇文章 LinkedList底层是双向、不带头结点、非循环的链表 /*** LinkedList的模拟实现*单向 不带头 非循环链表实现*/ class SingleLinkedList {class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val …

安全通信设置:使用 OpenSSL 为 Logstash 和 Filebeat 提供 SSL 证书

在为 Elasticsearch 采集数据时&#xff0c;我们经常使用到 Filebeat 及 Logstash。在我们之前的很多教程中&#xff0c;我们通常不为 Filebeat 和 Logstash 之前的通信做安全配置。 如何为 Filebeat 及 Logstash 直接建立安全的链接&#xff1f;这个在很多的情况下是非常有用的…

Python算法题集_环形链表

Python算法题集_环形链表 题234&#xff1a;环形链表1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【集合检索】2) 改进版一【字典检测】3) 改进版二【双指针】 4. 最优算法 本文为Python算法题集之一的代码示例 题234&#xff1a;环形链表 …

分享64个节日PPT,总有一款适合您

分享64个节日PPT&#xff0c;总有一款适合您 64个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/190YgEPzmbvopsht-n7YhpQ?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

Django模板(一)

一、基本规则 作为一个Web框架,Django需要一种方便的方式来动态生成HTML。最常用的方法依赖于模板。模板包含所需HTML输出的静态部分以及描述如何插入动态内容的特殊语法 1.1、django默认模板 在settings中配置: TEMPLATES = [{BACKEND: django.template.backends.django.…

Axios设置token到请求头的三种方式

1、为什么要携带token? 用户登录时&#xff0c;后端会返回一个token&#xff0c;并且保存到浏览器的localstorage中&#xff0c;可以根据localstorage中的token判断用户是否登录&#xff0c;登录后才有权限访问相关的页面&#xff0c;所以当发送请求时&#xff0c;都要携带to…

时序预测 | MATLAB实现基于CNN-GRU-AdaBoost卷积门控循环单元结合AdaBoost时间序列预测

时序预测 | MATLAB实现基于CNN-GRU-AdaBoost卷积门控循环单元结合AdaBoost时间序列预测 目录 时序预测 | MATLAB实现基于CNN-GRU-AdaBoost卷积门控循环单元结合AdaBoost时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于CNN-GRU-AdaBo…

[Linux] 网络编程套接字

目录 预备知识 网络字节序 网络字节序和主机字节序转换的库函数 socket编程接口 socket常见API sockaddr结构 套接字的种类 预备知识 1.在IP数据包头部中&#xff0c;有两个IP地址&#xff0c;分别叫做源IP地址和目的IP地址。 2.端口号&#xff1a;是传输层协议的内容…