{
This is a program to solve problem 3 on questions4, i.e. the problem from
the J. of Algorithms on finding the maximum of a[0..n] using a minimum
number of questions "is a[i] < k?".
}
program max(output);
type
state = array [1..5] of integer;
answer = record
questions: integer;
bestquestion: integer;
end;
var
i: integer;
perm: array [-1..5, -1..5] of integer;
current: state;
table: array [0..252] of answer;
{ A state is a set of n numbers in the range 0..m, ordered from highest to
lowest. The array entry "perm[n,m]" holds the number of possible states
for each pair of values n,m. The array is filled in using "perm[n,m] =
perm[n-1,m] + perm[n,m-1]". In fact, perm[n,m] is equal to the
binomial coefficient (n+m)Cn, so that perm is in fact just pascal's
triangle.
}
procedure initialise;
var n,m: integer;
begin
for n := -1 to 5 do perm[n,-1] := 0;
for m := -1 to 5 do perm[-1,m] := 0;
for n := 0 to 5 do perm[n,0] := 1;
for m := 0 to 5 do perm[0,m] := 1;
for n := 1 to 5 do for m := 1 to 5 do
perm[n,m] := perm[n-1,m] + perm[n,m-1];
end;
{ Information about each state is held in an array "table". This routine
finds the table entry corresponding to a particular state.
}
function sequence(x:state): integer;
begin
sequence :=
perm[5,x[1]-1] +
perm[4,x[2]-1] +
perm[3,x[3]-1] +
perm[2,x[4]-1] +
perm[1,x[5]-1];
end;
{ This routine does the reverse job - it finds the state corresponding to
a sequence number.
}
procedure findstate(n:integer; var x:state);
var i: integer;
begin
for i := 1 to 5 do begin
x[i] := 5;
while n < perm[6-i,x[i]-1] do x[i] := x[i] - 1;
n := n - perm[6-i,x[i]]
end;
end;
begin
initialise;
for i := 1 to 5 do current[i] := 5;
writeln(sequence(current));
findstate(250,current);
for i := 1 to 5 do write(current[i]);
writeln;
end.