Adding some more judges, here and there.
[and.git] / NEERC / javacert / check.dpr
blobbce926dd15d69b6e7d2ba6e6aaee2accb969eac1
1 (*\r
2     Checker for NEERC'2009 Problem J: Java Certification\r
3     (C) Pavel Mavrin\r
4 *)\r
5 \r
6 {$O+,Q+,R+}\r
7 {$APPTYPE CONSOLE}\r
8 \r
9 program Check;\r
11 uses\r
12   TestLib, SysUtils;\r
14 type
15   output = record
16     n: array[1..100] of integer;
17     w: array[1..100] of integer;
18     res: integer;
19   end;
20   
21 var\r
22   ja, pa: output;
23   m: integer;
24   nn, kk: integer;
25   p: array[1..100] of integer;  \r
27 function rint(a: double): integer;\r
28 var\r
29   res: integer;\r
30 begin\r
31   res := round(a);\r
32   if (abs(abs(res - a) - 0.5) < 1e-9) then begin\r
33     if (res mod 2 = 1) then begin\r
34       if (res > a) then res := res - 1 else res := res + 1;\r
35     end;\r
36   end;  \r
37   rint := res;\r
38 end;\r
40 procedure readoutput(var res: output; var strm: InStream; isPA: boolean);
41 var
42   i, s, min, max, pp: integer;
43 begin
44   for i := 1 to m do begin
45     res.w[i] := strm.readlongint;
46     res.n[i] := strm.readlongint;
47     if (isPA) then begin
48       if (res.n[i] < 1) or (res.n[i] > 100) then
49         quit(_WA, format('Invalid number of questions: %d, must be 1..100', [res.n[i]]));   
50       if (res.w[i] < 0) or (res.w[i] > res.n[i]) then
51         quit(_WA, format('Invalid number of wrong answers: %d, must be 0..%d', [res.w[i], res.n[i]]));
52     end;
53   end;
54   if isPA then begin
55     s := 0;
56     for i := 1 to m do begin
57       s := s + res.n[i];
58     end;
59     if (s <> nn) then quit(_WA, format('Wrong sum of questions: %d, must be %d', [s, nn]));
60     s := 0;
61     for i := 1 to m do begin
62       s := s + (res.n[i] - res.w[i]);
63     end;
64     if (s <> kk) then quit(_WA, format('Wrong sum of correct answers: %d, must be %d', [s, kk]));
65     for i := 1 to m do begin
66       pp := rint(100 * (res.n[i] - res.w[i]) / res.n[i]);
67       if (pp <> p[i]) then quit(_WA, format('Wrong percentage for category %d: %d instead of %d', [i, pp, p[i]]));
68     end;
69   end;\r
70   min := 1000;\r
71   max := 0;\r
72   for i := 1 to m do begin\r
73     if (res.n[i] < min) then min := res.n[i];\r
74     if (res.n[i] > max) then max := res.n[i];\r
75   end;\r
76   res.res := max - min;\r
77 end;
79 var
80   i: integer;
82 begin \r
84   kk := inf.readlongint;\r
85   nn := inf.readlongint;\r
86   m := inf.readlongint;
87   for i := 1 to m do 
88     p[i] := inf.readlongint;
89     
90   readoutput(pa, ouf, true);
91   readoutput(ja, ans, false);
93   if (pa.res > ja.res) then quit(_WA, format('Not optimal soluton: %d instead of %d', [pa.res, ja.res]));\r
94   if (pa.res < ja.res) then quit(_FAIL, format('Jury solution is not optimal: %d instead of %d', [pa.res, ja.res]));\r
96   quit(_OK, '');\r
97 end.\r