ice_tea

Untitled

Dec 22nd, 2017
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 4.37 KB | None | 0 0
  1. const
  2.   MAXN = 50;
  3.   MAXM = 50;          //это просто максимальные значения n и m
  4.  
  5. var
  6.   n, m, i, j, max, max_i: int64;               //int64 - тип данных, можешь заменить на integer
  7.   arr: array [1..MAXN, 1..MAXM] of int64;      //массив для входных данных
  8.   firstIndex: array [1..MAXM] of int64;        //запоминаем индексы
  9.   dp: array [1..MAXM] of int64;                //массив для подсчета динамики
  10.   last: array [1..MAXM] of int64;             //массив для возврата по динамике
  11.  
  12. procedure qsort(k, a, b: int64);              //можешь заменить на свою сортировку
  13. var
  14.   c, d, e, x: int64;
  15.  
  16. begin
  17.   if a < b then begin
  18.     x := arr[k, a + random(b - a)];
  19.     d := a;
  20.     e := b;
  21.     while d <= e do begin
  22.       while arr[k, d] < x do inc(d);                  
  23.       while arr[k, e] > x do dec(e);
  24.       if d <= e then begin
  25.         c := arr[k, d];
  26.         arr[k, d] := arr[k, e];
  27.         arr[k, e] := c;
  28.         inc(d);
  29.         dec(e);
  30.       end;
  31.     end;
  32.     qsort(k, a, e);
  33.     qsort(k, d, b);
  34.   end;
  35. end;
  36.  
  37. function check(k, p: int64): boolean;
  38. var
  39.   i: int64;
  40.  
  41. begin
  42.   for i := 1 to n do begin
  43.     if (arr[k, i] > arr[p, i]) then begin
  44.       check := false;                                  //проверка, что один лежит внутри другого
  45.       exit;
  46.     end;
  47.   end;
  48.   check := true;
  49. end;
  50.  
  51. function getV(k: int64): int64;
  52. var
  53.   i, ans: int64;
  54.  
  55. begin
  56.   ans := 1;
  57.   for i := 1 to n do                             //подсчет площади параллелепипеда
  58.     ans *= arr[k, i];
  59.   getV := ans;
  60. end;
  61.  
  62. procedure swapArr(k, p: int64);
  63. var
  64.   i: int64;
  65.  
  66. begin
  67.   for i := 1 to n do
  68.     swap(arr[k, i], arr[p, i]);                              //процедура для обмена местами двух массивов
  69. end;
  70.  
  71. procedure qsort1(a, b: int64);              //к сожалению, это не с++, чтобы писать два сорта в две строки
  72. var
  73.   d, e, x: int64;
  74.  
  75. begin
  76.   if a < b then begin
  77.     x := a + random(b - a);                        //random(b - a) - случайное число от 0 до b - a
  78.     d := a;
  79.     e := b;
  80.     while d <= e do begin
  81.       while getV(d) < getV(x) do inc(d);
  82.       while getV(e) > getV(x) do dec(e);
  83.       if d <= e then begin
  84.         swapArr(d, e);                                       //функция выше
  85.         swap(firstIndex[d], firstIndex[e]);                  //обмен элементов местами
  86.         inc(d);
  87.         dec(e);
  88.       end;
  89.     end;
  90.     qsort1(a, e);
  91.     qsort1(d, b);
  92.   end;
  93. end;
  94.  
  95. begin
  96.   readln(n, m);
  97.   for i := 1 to m do
  98.     for j := 1 to n do
  99.       read(arr[i, j]);               //ввод данных
  100.      
  101.   for i := 1 to m do begin
  102.     qsort(i, 1, n);               //сортировка сторон по возрастанию длинн сторон
  103.     firstIndex[i] := i;
  104.   end;
  105.  
  106.   qsort1(1, m);
  107.   for i := 1 to m do begin         //я точно не хочу это писать так, чтобы прога работала быстрее, особенно на паскале, особенно сейчас
  108.     max := 0;
  109.     for j := 1 to i - 1 do begin
  110.       if ((check(j, i)) and (dp[j] > max)) then begin
  111.         max := dp[j];                                    //поиск даибольшей возрастающей строки
  112.         max_i := j;
  113.       end;
  114.     end;
  115.     dp[i] := max + 1;
  116.     if (max > 0) then last[i] := max_i
  117.     else last[i] := -1;
  118.   end;
  119.  
  120.   max := 0;                                
  121.   for i := 1 to m do begin
  122.     if (dp[i] > max) then  begin
  123.       max := dp[i];                                       //поиск лучше возрастающей последовательности
  124.       max_i := i;
  125.     end;
  126.   end;
  127.  
  128.   writeln('максимальное количество прямоугольников - ', max);        //вывод
  129.   writeln('номера прямоугольников:');
  130.   while (last[max_i] > -1) do begin
  131.     writeln(firstIndex[max_i]);                                   //возврат по динамике
  132.     max_i := last[max_i];
  133.   end;
  134.   writeln(firstIndex[max_i]);
  135. end.
Add Comment
Please, Sign In to add comment