Believe it or not, Wrong answer
I was solving Top Batsmen using only mathematical methods (using combination equations that we all know) but I still get wrong answer… Please provide me with some test examples so I can debug my app
Here is my code :
program bestbats;
var
counter,t,l,k,i,j,temp,found1,found2:integer;
fact1,fact2,res:longint;
team,sorted:array[1..11] of integer;
begin
readln(t);
for l:=1 to t do
begin
for i:=1 to 11 do read(team[i]);
for i:=2 to 11 do
begin
j:=i;
while (j>1) and (team[j]>team[j-1]) do
begin
temp:=team[j];
team[j]:=team[j-1];
team[j-1]:=temp;
Dec(j);
end;
end;
readln(k); res:=0;
for i:=1 to k do
sorted[i]:=team[i];
counter:=1;
while counter<=k do
begin
temp:=sorted[counter]; found1:=0;
while sorted[counter]=temp do
begin Inc(counter); Inc(found1); end;
found2:=0;
for i:=1 to 11 do
if team[i]=temp then Inc(found2);
fact1:=1;
fact2:=1;
if found2<>found1 then
begin
for i:=1 to found1 do
begin
fact1:=fact1*i;
fact2:=fact2*found2;
Dec(found2);
end;
Res:=Res+(fact2 div fact1)-1;
end;
end;
Res:=Res+1;
WRITELN(res);
end;
end.
Well, here it goes. I sorted out the array, then I made new array containing only the best k players. And I checked how many times each member appears in original array and how many times in sorted array. If the number is the same there is only one way to put them in team, else I use combination equation. Equation should be familiar. It’s the usual mathematical way of calculation combinations (How many ways there is to choose 2 balls out of 6 --> 65/21 = 15). Then I take 1 out and later on add that one because that is the number of “original” combination. Hope this is precise enough
yep, that’s the basic approach. i’ll have a look at your code.
the first thing i can tell you, is that i get a value out of range error, running your code on a sample test file.
FPC 2.4.4
I see what might be the problem…
while sorted[counter]=temp do
begin Inc(counter); Inc(found1); end;
Here it will increase the counter to 12… Which will lead to this error maybe… But I don’t get that error
Can’t see what’s wrong
with the compiler i use: if that counter reaches 12 as a value, the created binary raises an error.
with the compiler you use: if that counter reaches 12 as a value, the created binary does not raise an error, but the following instructions will probably lead to a wrong result (be it on this test case or another one).
Just like I told you, 12 is not a problem… It still gives me 1 with this test example…
Anyway, I made correction regarding that part of code
program bestbats;
var
counter,t,l,k,i,j,temp,found1,found2:integer;
fact1,fact2,res:longint;
team,sorted:array[1…12] of integer;
begin
readln(t);
for l:=1 to t do
begin
for i:=1 to 11 do read(team[i]);
team[12]:=-1; sorted[12]:=-1;
for i:=2 to 11 do
begin
j:=i;
while (j>1) and (team[j]>team[j-1]) do
begin
temp:=team[j];
team[j]:=team[j-1];
team[j-1]:=temp;
Dec(j);
end;
end;
readln(k); res:=0;
if k>11 then begin writeln(res); continue; end;
for i:=1 to k do
sorted[i]:=team[i];
counter:=1;
while counter<=k do
begin
temp:=sorted[counter]; found1:=0;
while sorted[counter]=temp do
begin Inc(counter); Inc(found1); end;
found2:=0;
for i:=1 to 11 do
if team[i]=temp then Inc(found2);
fact1:=1;
fact2:=1;
if found2<>found1 then
begin
for i:=1 to found1 do
begin
fact1:=fact1*i;
fact2:=fact2*found2;
Dec(found2);
end;
Res:=Res+(fact2 div fact1)-1;
end;
end;
Res:=Res+1;
WRITELN(res);
end;
end.
This code MUST pass even the array boundaries problem
Thanks for your help, I really appreciate what you do and I must admit CodeChef is one the best sites I’ve ever used
Can’t believe what’s going on
When I put only the second test case it prints out 1, when I put both for first one and second one it prints out the first correctly, but for the second one it makes a mistake printing out 0… Can’t believe it