Описание
K членов жюри X Всероссийской олимпиады школьников по информатике решили отметить столь круглую годовщину в одном из лучших ресторанов на Невском проспекте. На десерт вниманию жюри предложили торт, имеющий форму прямоугольной призмы с выпуклым N-угольником в основании. Жюри вооружается десертными ножами и собирается справедливо разделить торт на K частей равного объема. Ножами можно проводить прямые вертикальные разрезы от одной границы торта до другой; различные разрезы могут иметь общие точки лишь в своих концевых вершинах

Задание
Напишите программу, помогающую членам Жюри построить требуемые K-1 разрезов


Входные данные
В первой строке входного файла содержатся два целых числа K и N (1
K,N50). Далее следуют N пар вещественных чисел – координаты последовательно расположенных вершин N-угольника

Выходные данные
Каждый из K-1 разрезов в выходном файле должен быть представлен четверкой чисел – координатами своих концов. Все числа должны быть разделены пробелами и/или символами перевода строки


Например:

PIE.IN
4 3
2 1
0 0.5
4 0.5

PIE
.OUT
2 1  1 0.5
2 1  2 0.5
2 1  3 0.5






Идеи
Площадь треугольника

Комментарии

Найдем площадь основания куска торта для одного члена жюри. Для этого вычислим общую площадь многоугольника S и разделим ее на количество членов K. Отрезать куски членам жюри будем по очереди: сначала отрежем первому, затем от оставшегося многоугольника отрежем второму и т.д. Все разрезы при этом будем проводить через первую вершину исходного многоугольника.
 
Для отрезания очередного куска поступим следующим образом. Один конец разреза уже фиксирован, а второй перемещается по контуру оставшегося многоугольника до тех пор, пока не "отмерит" нужную площадь. Сначала он перемещается, прыгая от одной вершины многоугольника к следующей (каждый раз при этом к площади ранее отмеренного куска добавляется площадь треугольника, образованного первой, текущей и следующей вершинами). Как только мы отмерим лишнего (т.е. площадь куска, отрезанного через текущую вершину, меньше S/K, а через следующую – больше), в качестве второго конца разреза нужно взять точку на только что пройденной стороне многоугольника. Осталось разделить эту сторону в отношении, приводящем к куску требуемой площади


Упражнение
Решите аналогичную задачу о разрезании для случая невыпуклого торта и K = 2, 3



Решение

{$A+,B-,D+,E-,F-,G+,I+,L+,N+,O-,P-,Q-,R-,S+,T-,V+,X+,Y+}

{$M 16384,0,655360}
 
program pie;
type float = double;
var n1, n, k: integer;
    x, y: array [1..320] of float;
    l, r: integer;
    Sq: float;
    x1, y1, y2: array [1..320] of float;
 
procedure ReadAll;
var i: integer;
begin
  assign (input, 'pie.in');
  reset (input);
    read (k);
    read (n);
    for i := 1 to n do
      read (x[i], y[i]);
  for i := 1 to n do
  begin
    x[i+n] := x[i];
    y[i+n] := y[i];
  end;
  close (input);
end;
 
procedure FindSq;
var i: integer;
begin
  sq := 0;
  for i := 2 to n-1 do
    sq := sq + abs((x[i]-x[1]) * (y[i+1]-y[1]) - (y[i]-y[1]) * (x[i+1]-x[1]));
end;
 
procedure CutSq (s: float);
var ds, ns, cs: float;
    i: integer;
    xx, yy: float;
begin
  i := 1;
  cs := 0;
  while cs < s do
  begin
    inc (i);
    ns := abs((x[i]-x[1]) * (y[i+1]-y[1]) - (y[i]-y[1]) * (x[i+1]-x[1]));
    cs := cs + ns;
  end;
  cs := cs - ns;
  ds := s-cs;
  xx := x[i] + (x[i+1]-x[i]) * ds/ns;
  yy := y[i] + (y[i+1]-y[i]) * ds/ns;
  writeln (x[1]{:10:10},' ',y[1]{:10:10},' ', xx{:10:10},' ',yy{:10:10});
end;
 
procedure Solve;
var i: integer;
begin
  FindSQ;
  assign (output, 'pie.out'); rewrite (output);
  for i := 1 to k-1 do
   CutSq (i / k * abs(Sq));
   close (output);
end;
 
begin
  ReadAll;
  Solve;
end.

 


© Особенности национальных задач по информатике