停车位【题解】

一个圆形停车场有n个车位,汽车按编号顺序进入,首选停车位由特定公式确定。如果首选车位已被占用,则从下一个车位开始找空位,计算所有汽车停车过程中的冲突次数。通过并查集或线段树等数据结构可以实现O(kn)时间复杂度的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

有一个圆形的停车场,里面有n个停车位。停车位的编号从0至n-1,因为停车场是圆形的,所以第n-1个停车位的下一个停车位就是第0个停车位。

一开始所有停车位都是空的。现在有n台汽车排队进来停车,只有前面进去的车已经停好位置了,那么下一台汽车才能进入停车场。

n台汽车的编号是从0至n-1, 注意:汽车的编号与停车位的编号不是直接对应关系,第i台汽车不一定停在第i个停车位。

确切一点说,第i台汽车最喜欢停在第p[i]个停车位,但是如果在它前面进场的汽车已经把该停车位占据了,

那么第i台汽车就会从第p[i]+1个停车位开始往后搜索,一旦找到一个空的停车位,第i台汽车就停在那个空的停车位。

容易发现,一台汽车在找到合适的停车位之前,可能出现多次“冲突”。

例如第i台汽车最喜欢停在第p[i]个停车位,但是第p[i]个停车位被占了,那么就“冲突”1次,

然后第i台汽车就想停在第p[i]+1个停车位,如果第p[i]+1个停车位也被占了,那么又多了1次“冲突”,…

问当所有的汽车都停车结束以后,停车过程中,总共产生了多少次冲突?

输入格式

多组测试数据。

第一行,一个整数G,表示有G组测试数据。1<=G<=10。

每组测试数据格式如下:

一行,4个整数:n,A,B,C。1<=n<=250000。0 <= A,B,C < n。

其中A,B,C三个整数的作用是用来产出p[i]的。

P[i] = (Aii + B*i + C) % n, 其中 0<=i<n。

输出格式

共G行,每行一个整数。

输入样例

5

47 0 1 0

47 0 0 42

30 1 1 1

250000 2352 32652 199975

250000 0 0 248987

输出样例

0

1081

175

93375000

31249875000


如果你看到的只是 HASH,很遗憾,你错了。

如果按普通 HASH 插入,显然时间复杂度不可接受。设 d [ x ] d[x] d[x] 表示在第 x 个位置之后的第一个空的停车位之前的一个位置。那么如果 p [ x ] p[x] p[x] 被占找到一个空的位置 k k k,令

     [题描述]   设停车场一个可停放n辆汽车的下狭长通道,且只有一个大门可供汽车进出,汽车在停车场内按车辆到达的时间先后排序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车厂的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该车开出大门外,其他车辆再按照原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制上述要求的管理模拟程序。 [基本要求]    以栈模拟停车场,以队列模拟车场外的便道,按照从终端输入的数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“达到”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输入汽车在停车场内或便道上的停车位置;若是车辆到达,则输出汽车在停车场内或便道上的停车位置,若是车辆离去,则输出在汽车在停车场内停留的时间和应缴纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。      [测试数据]    设n=2,输入数据:    (”A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)    其中:’A’表示到达(Arrival);’D’表示离去(Departure),‘E’表示输入结束(End)。      [实现提示]    需另设一个栈,临时停放为要给离去的汽车让路而从停车场退出来的汽车,也哟个顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的排照号码和进入停车场的时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值