如果你不熟悉这个问题,那就像this。
我没有来请求答案,我实际完成了所有编码。我刚刚发现我的解决方案并没有以最好的方式解决它,因为我的解决方案只能在桥上一次只允许一辆车。我希望我能得到一些关于如何使用sem_wait和sem_post来解决这个问题的技巧。我希望允许同一方向的交通流动,而不是一次流动。
我的解决方案目前看起来像:
(默认sem_t北和南= 1解锁1车)
如果是northcar,则sem_wait(南),sem_wait(北)。过桥,然后是sem_post(北),sem_post(南)。这显然是错误的,因为它将桥梁锁定在除了上面的车辆之外的所有车辆上。我想让流量一起流动。有任何想法吗?
我正在使用随机生成的流量,这会增加一些复杂性。
答案 0 :(得分:2)
在现实生活中,你可以用交通信号灯来解决这个问题,这个交通信号灯是红色 - 北/绿 - 南,绿 - 北/红 - 南,或红 - 北/红 - 南,以及接近和退出的传感器在桥的两端都有车道。
假设灯光从红色 - 北/绿 - 南开始。汽车可以从南到北不停地流动。当汽车从北方驶入时,它停在红灯处并触发北方进近传感器。这使得光线向南 - 红色,但它仍然是红色 - 北方。当当前在桥上的所有车辆都离开时(在出口时触发北出口传感器),灯可以变为绿色 - 北。这种状态持续到另一辆汽车从南方来,并触发南方进近传感器。
考虑一下如何将其转换为代码。 (您需要使用信号量的计数属性。)
答案 1 :(得分:2)
单线公路 问题描述 一定数量的汽车正在通过单车道。所有汽车的速度各不相同。显而易见,根据汽车的速度,会形成不同的组。
不允许单车道通过/超车。在给定的汽车速度下,如果考虑到所有可能的排列,计算可以形成多少组。请参考example1以获得更好的理解。
打印组数除以排列数。
约束
0 <= N < 10 ^ 5
0 <= speed of individual vehicle < 10 ^ 9
输入
第一行包含一个integer
N,代表车辆数量
第二行包含N个integers
分隔的空格,表示各个车辆的速度。
输出 打印组数除以排列数并四舍五入到小数点后六位。
时间限制 1
示例1
输入 3
10 20 30
输出
1.833333
说明:
因此所有可能的排列是:
{10 20 30} {10 30 20}
{20} {10 30}
{20 30} {10}
{30} {10 20}
{30 20} {10}
因此,这里共有6个排列,组总数为11。
因此,输出为11/6 = 1.833333
示例2
输入 4
56 78 13 92
输出
2.083333
说明:
所以这里总共有24个排列
例如:
{56 78 13 92}
{92} {13 78 56}
{56} {13 92 78}
{78 92} {13 56}
.
.
依此类推。组总数为50。
因此,输出为50/24 = 2.083333
答案 2 :(得分:0)
这是我刚刚掀起的一些伪蟒蛇。基本上阻止一种方式,让有限数量的汽车通过。根据您使用变量的方式,这可能完全错误:
function main():
while(true):
if(north_car):
let_north_cars_through()
if(south_car):
let_south_cars_through()
function let_south_cars_through():
sem_wait(north)
for(i = 0; i < max cars; i++):
if(south_car):
cross_bridge()
else:
break;
sem_post(north)
function let_north_cars_through()
sem_wait(south)
for(i = 0; i < max cars; i++):
if(north_car):
cross_bridge()
else:
break;
sem_post(south)