Фрезерні верстати#7714

Фрезерні верстати (Розбір)

Програма фрезерування складається з кроків. Нехай на -му (1 \le i \le s) кроці від поверхні в стовпці j~(1 \le j \le x) зрізається шар товщиною m_{ij}. Тоді очевидно, що сумарно в стовпці буде знято

max(m_{1j}, m_{2j}, ..., m_{sj})

Схемою фрезерування будемо називати набір цілих чисел

(cuts_1, cuts_2, ..., cuts_x),

де

cuts_j = max(m_{1j}, m_{2j}, ..., m_{sj}), 1 \le j \le x

Одна і та ж схема фрезерування застосовується до всіх деталей. Після обчислення значень cuts_j~(1 \le j \le x) цю схему послідовно застосовуємо до кожної деталі.

Реалізація алгоритму

Оголосимо робочі масиви. Інформацію про деталі будемо зберігати в масиві , а схему фрезерування — в масиві .

int detail[10001][101], cuts[101];

Читаємо вхідні дані.

scanf("%d %d %d %d", &w, &s, &x, &y);

Читаємо інформацію про деталі.

for (i = 0; i < w; i++)
for (j = 0; j < x; j++)
  scanf("%d", &detail[i][j]);

Читаємо і обробляємо кроків програми фрезерування. Для кожної позиції значення cuts[j] буде позначати максимальну глибину вирізу, виконаного на якомусь кроці.

for (i = 0; i < s; i++)
for (j = 0; j < x; j++)
{
  scanf("%d", &val);
  if (val > cuts[j]) cuts[j] = val;
}

Максимально можлива висота заготовки дорівнює . Фрезерна головка в позиції опускається на глибину cuts[j]. Отже, після фрезерування в позиції у -ї деталі залишиться висота, рівна

min(detail[i][j], y - cuts[j]).
for (i = 0; i < w; i++)
{
  for (j = 0; j < x; j++)
    printf("%d ", min(detail[i][j], y - cuts[j]));
  printf("\n");
}