回 帖 发 新 帖 刷新版面

主题:[讨论]传送消息的问题

有一队n个人,先给他们编号:左起第k个人就是k号。

1号是个特殊的人,他不断地接收消息,每分钟他就会接到一份消息。已知,比一个人编号大并且手上没有消息的人都是他的后继者,而一个人的后继者中编号最小的一个是他的最先后继者。1号接到消息以后,会把消息立刻传给他的最先后继者,除了1号之外,每个人拿到消息后都会阅读一下这份消息,阅读完之后会立刻把消息传给他的最先后继者。不管是谁,如果他在传送消息时已经没有后继者了,他就会把这份消息扔掉。如果在同一时间内有多个人要传送消息,则编号小的优先。

现在你的任务是:输出t分钟后(即在t分钟要传送消息的人全部传送完之后)有几个人手上有消息,他们是哪几个人。当然,由于1号拿到消息之后总是把它给别人或者扔掉,因此他从来手上不会有消息,所以你只要输出2-n号中有几个人手上有消息、分别是哪几个人就行了。

[输入]
第1行是一个整数,表示人数n(3<=n<=30),第二行n - 1整数,表示2号、3号……n号阅读一份消息的时间(单位:分钟,比如一个人在第2分钟拿到消息,3分钟阅读完,则要到第5分钟才能给别人或者扔掉),最后一行是总时间t。
[输出]
一行输出,n - 1个整数,用0和1表示,依次表示2号、3号……n号在t分钟后手上有没有消息,0表示没有,1表示有。

[样例输入]
6
3 3 1 1 2
5
[样例输出]
1 0 1 0 1

回复列表 (共2个回复)

沙发

直接模拟...........

板凳

大家看看我的程序对不对啊!
TYPE arr = ARRAY[2..30] OF INTEGER;
VAR
   r: arr; n: INTEGER;
FUNCTION first_p(code: INTEGER): INTEGER;
VAR
   i, k: INTEGER;
BEGIN
    k := 0;
    FOR i:=code + 1 TO n DO BEGIN
        IF r[i] = 0 THEN BEGIN k := i; BREAK; END;
    END;
    first_p := k;
END;
VAR
   i, j, t, fs: INTEGER; tm, rr: arr;
BEGIN
    READLN(n);
    FOR i:=2 TO n DO READ(tm[i]);
    READLN(t);
    FOR i:=1 TO t DO BEGIN
        fs := first_p(1);
        FOR j:=2 TO n DO rr[j] := 0;
        IF fs > 0 THEN BEGIN r[fs] := r[fs] + 1; rr[fs] := 1; END;
        FOR j:=2 TO n DO BEGIN
            IF (r[j] > 0) AND (rr[j] = 0) THEN r[j] := r[j] + 1;
        END;
        FOR j:=2 TO n DO BEGIN
            IF r[j] > tm[j] THEN BEGIN
               fs := first_p(j); r[j] := 0;
               IF fs > 0 THEN r[fs] := r[fs] + 1;
            END;
        END;
    END;
    FOR i:=2 TO n DO BEGIN
        IF r[i] > 0 THEN WRITE('1 ') ELSE WRITE('0 ');
    END;
END.

我来回复

您尚未登录,请登录后再回复。点此登录或注册