http://www.vijos.org/Problem_Show.asp?id=1749
Program Qc;Varline:array[0..80] of longint;utime:array[0..20000] of boolean;used:array[0..80] of boolean;hhmm:array[0..80] of longint;i,j,n:longint;str:string;Function GetTime(str:string ):longint;Vari:longint;Time:longint;Begin Time:=0; for i:=1 to length(str) do Time:=Time*10+ord(Str[i])-ord('0'); Exit(time);End;
Procedure Search(now:longint);Vari:longint;Begin if now>n then Begin For i:=1 to n do write(line[i],' '); End; for i:=0 to n-1 do Begin line[now]:=i; if not(used[i]) and (hhmm[now]+i*100<((n-1)*100+59)) and (hhmm[now]+i*100>hhmm[now-1]) and not(utime[hhmm[now]+i*100]) then Begin used[i]:=true; hhmm[now]:=hhmm[now]+i*100; utime[hhmm[now]]:=true; search(now+1); utime[hhmm[now]]:=false; hhmm[now]:=hhmm[now]-i*100; used[i]:=false; End; End;End;
Begin readln(n); For i:=1 to n do Begin readln(str); hhmm[i]:=GetTime(str); End; fillchar(Used,sizeof(used),false); fillchar(utime,sizeof(utime),false); fillchar(line,sizeof(line),0); search(1);End.
Program Qc;Varline:array[0..80] of longint;utime:array[0..20000] of boolean;used:array[0..80] of boolean;hhmm:array[0..80] of longint;i,j,n:longint;str:string;Function GetTime(str:string ):longint;Vari:longint;Time:longint;Begin Time:=0; for i:=1 to length(str) do Time:=Time*10+ord(Str[i])-ord('0'); Exit(time);End;
Procedure Search(now:longint);Vari:longint;Begin if now>n then Begin For i:=1 to n do write(line[i],' '); End; for i:=0 to n-1 do Begin line[now]:=i; if not(used[i]) and (hhmm[now]+i*100<((n-1)*100+59)) and (hhmm[now]+i*100>hhmm[now-1]) and not(utime[hhmm[now]+i*100]) then Begin used[i]:=true; hhmm[now]:=hhmm[now]+i*100; utime[hhmm[now]]:=true; search(now+1); utime[hhmm[now]]:=false; hhmm[now]:=hhmm[now]-i*100; used[i]:=false; End; End;End;
Begin readln(n); For i:=1 to n do Begin readln(str); hhmm[i]:=GetTime(str); End; fillchar(Used,sizeof(used),false); fillchar(utime,sizeof(utime),false); fillchar(line,sizeof(line),0); search(1);End.

