fork download
  1. Program sairsodo;
  2. const MAXN=100000;
  3. type elenco = array[1..MaXN] of int64;
  4. var N,i,d, idmediana, idmediana1, mediana:int64;
  5. calcolacosto,calcolacosto1, altezzainiziale, altezzainiziale1, differenza:int64;
  6. costo, costo1, costomin, ricordacostomin:int64;
  7. H, ricordaltezze: elenco;
  8. uscita, invariato:boolean;
  9. ricordaintervallo:char;
  10. Procedure scambia (var a,b: int64);
  11. var x:int64;
  12. begin
  13. x:=a;
  14. a:=b;
  15. b:=x;
  16. end;
  17. Procedure ordinamento (estremoi,estremos:int64; var v : elenco; ordinato:boolean);
  18. var inf, sup, medio:int64;
  19. pivot :int64;
  20. begin
  21. inf:=estremoi;
  22. sup:=estremos;
  23. medio:= (estremoi+estremos) div 2;
  24. pivot:=v[medio];
  25. repeat
  26. if (ordinato) then
  27. begin
  28. while (v[inf]<pivot) do inf:=inf+1;
  29. while (v[sup]>pivot) do sup:=sup-1;
  30. end;
  31. if inf<=sup then
  32. begin
  33. scambia(v[inf],v[sup]);
  34. inf:=inf+1;
  35. sup:=sup-1;
  36. end;
  37. until inf>sup;
  38. if (estremoi<sup) then ordinamento(estremoi,sup,v,ordinato);
  39. if (inf<estremos) then ordinamento(inf,estremos,v,ordinato);
  40. end;
  41.  
  42. begin
  43. (*assign(input, 'input.txt'); reset(input);
  44.   assign(output, 'output.txt'); rewrite(output);*)
  45. readln(N);
  46. for i:=1 to N do begin read(H[i]); ricordaltezze[i]:=H[i]; end;readln;
  47. costo:=0; d:=0; ricordacostomin:=9223372036854775807; uscita:=false;
  48. ordinamento (1,N,H, true);
  49. invariato:=false; ricordaintervallo:=' ';
  50. if N mod 2 <>0 then
  51. begin
  52. idmediana:=(N+1) div 2;
  53. altezzainiziale:=H[idmediana]-(idmediana-1);
  54. if altezzainiziale<0 then altezzainiziale:=0;
  55. for i:=1 to N do
  56. begin
  57. calcolacosto:=(ricordaltezze[i] - (altezzainiziale +i-1));
  58. if calcolacosto<0 then calcolacosto:=-calcolacosto;
  59. costo:= costo + calcolacosto ;
  60. end;
  61. writeln(costo);
  62. end
  63. else
  64. begin
  65. idmediana:= N div 2;
  66. idmediana1:=idmediana+1;
  67. mediana:= (H[idmediana1]+ H[idmediana1 + 1]) div 2; (*altezza che corrisponde alla mediana*)
  68. altezzainiziale:=mediana-idmediana1;
  69. while altezzainiziale<0 do altezzainiziale:=altezzainiziale+1;
  70. if altezzainiziale<=0 then altezzainiziale:=0;
  71.  
  72. for i:=1 to N do
  73. begin
  74. calcolacosto:=(ricordaltezze[i] - mediana)+i-1;
  75. if calcolacosto<0 then calcolacosto:=-calcolacosto;
  76. costo:=costo+calcolacosto;
  77. end;
  78.  
  79.  
  80. end;
  81. writeln(costo );
  82. end.
  83.  
Success #stdin #stdout 0s 5284KB
stdin
50
40 19 38 25 11 48 14 27 45 27 42 29 49 43 37 49 4 23 17 30 2 22 19 15 17 41 10 30 46 13 13 36 32 2 11 46 2 27 23 47 7 17 28 6 10 15 6 14 40 25
stdout
1270