单车道桥梁问题

时间:2010-10-11 16:19:15

标签: c semaphore

如果你不熟悉这个问题,那就像this

我没有来请求答案,我实际完成了所有编码。我刚刚发现我的解决方案并没有以最好的方式解决它,因为我的解决方案只能在桥上一次只允许一辆车。我希望我能得到一些关于如何使用sem_wait和sem_post来解决这个问题的技巧。我希望允许同一方向的交通流动,而不是一次流动。

我的解决方案目前看起来像:

(默认sem_t北和南= 1解锁1车)

如果是northcar,则sem_wait(南),sem_wait(北)。过桥,然后是sem_post(北),sem_post(南)。这显然是错误的,因为它将桥梁锁定在除了上面的车辆之外的所有车辆上。我想让流量一起流动。有任何想法吗?

我正在使用随机生成的流量,这会增加一些复杂性。

3 个答案:

答案 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)