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:
INPUT | OUTPUT | |
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.