BCTHIDAU spoj PTIT – Thi đấu

Nguồn đề bài: http://www.spoj.com/PTIT/problems/BCTHIDAU/

1. Đề bài BCTHIDAU spoj PTIT

Trong cuộc thi ACM, các đội thi đấu với nhau. Thứ hạng của mỗi đội phụ thuộc vào: số lượng bài giải được và số điểm bị phạt (điểm phạt phụ thuộc vào thời gian và số lần nộp bài trước khi bài đó được giải đúng). Điểm phạt bằng thời gian nộp bài đúng cộng với 20 phút cho mỗi lần nộp sai. Nếu một bài không giải được thì những lần nộp sai bài đó không bị tính điểm phạt. Như vậy nếu đội giải đúng vào lần nộp thứ 2, sau 20 phút thì điểm phạt sẽ là 40 điểm. Đội thắng là đội giải được nhiều nhất, nếu có nhiều đội có số bài giải giống nhau thì đội bị phạt ít hơn sẽ giành chiến thắng.

Input: Cuộc thi ACM lần này chỉ có 4 bài.

Dòng 1: số n tương ứng với số đội thi

Dòng 2 đến dòng n+1: Mỗi dòng ghi

<Tên> <p1SuB> <p1Time> <p2SuB> <p2Time>….<p4Time>

Thành phần đầu tiên là tên đội, không chứa dấu cách. Sau đó là thông tin về đội đó: p1Sub số lần đội nộp lời giải cho bài 1, p1Time là thời điểm đội nộp đúng, nếu đội không giải đúng được bài 1 thì p1Time=0, tương tự với 3 bài còn lại.

Output: Ghi tên đội thắng, số bài giải được, số điểm phạt

Ví dụ cho Input và Output:

INPUTOUTPUT
4

Stars 2 20 5 0 4 190 3 220

Rockets 5 180 1 0 2 0 3 100

Penguins 1 15 3 120 1 300 4 0

Marsupials 9 0 3 100 2 220 3 80

Penguins 3 475

2. Thuật toán BCTHIDAU spoj PTIT

– Từ dữ liệu đưa vào của mỗi đội, tính số bài đúng và số điểm phạt, cập nhật kết quả tối ưu và lưu thông tin đội mạnh nhất.

3. code tham khảo BCTHIDAU spoj PTIT

const   fi='';
type    data=longint;
var
        f:text;
        S:string;
        n:data;

procedure docfile;
var     i,j:data;
        ch:char;

        s1,s2,s3,s4,t1,t2,t3,t4:data;
        pointmax,point:data;
        slmax,sl:data;
        namemax:string;

begin
        assign(f,fi); reset(f);
        readln(f,n);

        slmax:=-1;

        for i:=1 to n do
                begin
                        s:='';
                        while not eoln(f) do
                                begin
                                        read(f,ch);
                                        if ch<>' ' then
                                                s:=s+ch
                                        else
                                                break;
                                end;
                        readln(f,s1,t1,s2,t2,s3,t3,s4,t4);

                        sl:=0;
                        point:=0;
                        if t1<>0 then
                                begin
                                        inc(sl);
                                        point:=point+ (s1-1)*20 + t1;
                                end;
                        if t2<>0 then
                                begin
                                        inc(sl);
                                        point:=point+ (s2-1)*20 + t2;
                                end;

                        if t3<>0 then
                                begin
                                        inc(sl);
                                        point:=point+ (s3-1)*20 + t3;
                                end;
                        if t4<>0 then
                                begin
                                        inc(sl);
                                        point:=point+ (s4-1)*20 + t4;
                                end;

                        if sl>slmax then
                                begin
                                        namemax:=s;
                                        slmax:=sl;
                                        pointmax:=point;
                                end
                        else
                                if (sl=slmax) and (pointmax>point) then
                                        begin
                                                namemax:=s;
                                                slmax:=sl;
                                                pointmax:=point;
                                        end;
                end;
        write(namemax,' ',slmax,' ',pointmax);
        close(f);
end;

begin
        docfile;
end.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *