Guest User

Untitled

a guest
May 20th, 2018
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 2.15 KB | None | 0 0
  1. uses sysutils, testlib;
  2.  
  3. {$APPTYPE CONSOLE}
  4. {$O-,Q+,R+}
  5.  
  6. const
  7.   maxn = 100;
  8.  
  9. type
  10.   TArr = array[1..maxn] of integer;
  11.  
  12. procedure readPermutation(var arr:TArr; n:longint; name:string);
  13. var
  14.   i:longint;
  15.   was:array[1..maxn] of boolean;
  16. begin
  17.   assert(n <= maxn);
  18.   for i := 1 to n do
  19.     was[i] := false;
  20.  
  21.   for i := 1 to n do begin
  22.     arr[i] := inf.readintegerrange(1, n);
  23.     if was[arr[i]] then
  24.       quit(_fail, format('%s: number %d occurs twice', [ name, arr[i] ]));
  25.     was[arr[i]] := true;
  26.   end;
  27.   for i := 1 to n do
  28.     assert(was[i]);
  29. end;
  30.  
  31. var
  32.   n:longint;
  33.   src, dest:TArr;
  34.  
  35. const
  36.   maxops = 100000;
  37.  
  38. function readAnswer(var f:InStream; wa, pe:TResult):Longint;
  39. var
  40.   cur:TArr;
  41.  
  42. procedure move(st, len:longint);
  43. var
  44.   ne, tmp:longint;
  45. begin
  46.   while len > 0 do begin
  47.     ne := (st mod n) + 1;
  48.     tmp := cur[st]; cur[st] := cur[ne]; cur[ne] := tmp;
  49.     st := ne;
  50.     dec(len);
  51.   end;
  52. end;
  53.  
  54. var
  55.   i, tmp:longint;
  56.   ops:longint;
  57.   cop:longint;
  58. begin
  59.   for i := 1 to n do cur[i] := src[i];
  60.  
  61.   result := -1;
  62.   ops := 0;
  63.   f.skip([' ', #10, #13, #9]);
  64.   while not f.eof do begin
  65.     cop := f.readintegerrange(1, n); f.skip([' ', #10, #13, #9]);
  66.     inc(ops);
  67.     if ops > maxops then quit(pe, format('Maximum numbers of operations exceeded (%d)', [ maxops ]));
  68.  
  69.     for i := 1 to n do if cur[i] = cop then
  70.       move(i, cop);
  71.   end;
  72.  
  73.   while cur[1] <> 1 do begin
  74.     tmp := cur[1];
  75.     for i := 1 to n - 1 do
  76.       cur[i] := cur[i + 1];
  77.     cur[n] := tmp;
  78.   end;
  79.  
  80.   for i := 1 to n do
  81.     if cur[i] <> dest[i] then quit(wa, 'Not a resulting sequence got in the end');
  82.   result := ops;
  83. end;
  84.  
  85.  
  86. var
  87.   i:longint;
  88.   g:boolean;
  89.  
  90.   ja, pa:longint;
  91. begin
  92.   n := inf.readintegerrange(3, 100);
  93.   readPermutation(src, n, 'Source permutation');
  94.   readPermutation(dest, n, 'Resulting permutation');
  95.  
  96.   g := false;
  97.   for i := 1 to n do g := g or (src[i] <> dest[i]);
  98.   if not g then
  99.     quit(_fail, 'Starting and resulting permutaitons are equal');
  100.  
  101.   ja := readAnswer(ans, _fail, _fail);
  102.   pa := readAnswer(ouf, _wa, _pe);
  103.   quit(_ok, format('Ok, participant used %d steps (jury used %d)', [ pa, ja ]));
  104. end.
Add Comment
Please, Sign In to add comment