Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 09.02.2014, 16:19   #1
Dalmar2008
 
Регистрация: 09.02.2014
Сообщений: 4
По умолчанию Нужна помощь с доработкой программы

Не пойму в чём проблема. Вот собственно сама задача: На плоскости дан набор точек с целочисленными координатами. Необходимо найти такой треугольник наибольшей площади с вершинами в этих точках, у которого нет общих точек с осью Оу, а одна из сторон лежит на оси Ох.

А вот моё решение:
Код:
var t1,t2,n,i,x,y,h,p: integer;
   s:real;
begin
 readln(n);
 p:=0;
 t1:=maxint;
 t2:=-maxint;
 s:=0;
 h:=0;
 for i:= 1 to n do 
 begin
  readln(x,y);
  if (y=0) and (x<>0) and (x>t2) then
  begin
    t2:=x;
    p:=1;
  end;
  if (y=0) and (x<>0) and (x<t1) then t1:=x;
  if (y<>0) and (abs(y)>abs(h)) then h:=y;
 end;
 if (p=1) then s:=0.5*abs(abs(t2)-abs(t1))*abs(h);
 if (s=0) then writeln('0')
  else writeln(s);
end.
При вводе данных
Цитата:
8
-10 0
2 0
0 4
3 3
7 0
5 5
4 0
9 -9
Должно выводить 22.5, у меня выводит 13.5

Нужна ваша помощь!

Последний раз редактировалось Stilet; 09.02.2014 в 21:02.
Dalmar2008 вне форума
Старый 09.02.2014, 20:46   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Так понимаю, что неверно делается отбор точек. Поскольку точки треугольника должны лежать в одной (правой либо левой) полуплоскости, то, например,
Код:
t1:=maxint;
t2:=-maxint;
уже неверно. Вот один из вариантов, который дает нужное решение:
Код:
var n, i, x, y : integer;
    al, bl, hl : integer;
    ar, br, hr : integer;
        fl, fr : boolean;
            fh : text;
        s1, s2 : real;
  begin
  assign(fh, 'c:\fpc\triangl.txt');
  reset(fh);
  readln(fh, n);
  al := 0; hl := 0; bl := -maxint; fl := false;
  ar := maxint; hr := 0; br := 0; fr := false;
  for i := 1 to n do
  begin
     readln(fh, x, y);
     if x <> 0 then
     begin
        if (x < 0) then
        begin
           if ((x > bl) And (y = 0)) then
           begin
              bl := x;
              fl := true;
           end;
           if ((x < al) And (y = 0)) then
              al := x;
           if (abs(y) > hl) then
              hl := abs(y);
        end
        else
        begin
           if ((x > br) And (y = 0)) then
           begin
              br := x;
              fr := true;
           end;
           if ((x < ar) And (y = 0)) then
              ar := x;
           if (abs(y) > hr) then
              hr := abs(y);
        end;
     end;
  end;
  if ((hl <> 0) And (al <> 0) And fl) then
     s1 := abs((bl - al) * hl)/2;
  if ((hr <> 0) And (br <>0) And fr) then
     s2 := abs((br - ar) * hr)/2;
  if s1 > s2 then
     writeln(' s1= ', s1:6:2, '  al = ', al, '  bl = ', bl, ' hl = ', hl)
  else
     writeln(' s2= ', s2:6:2, '  ar = ', ar, '  br = ', br, ' hr = ', hr);
  readln;
  end.
Отбор точек ведется индивидуально для левой и правой полуплоскостей.
Вычисляется площадь каждого из возможных треугольников и выводятся параметры треугольника с бОльшей площадью. Данные (n, x, y) читаются из файла.

Как-то так, ...
Как-то так, ...
ViktorR вне форума
Старый 09.02.2014, 21:09   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Задачка, легко решается методом "линейного программирования". Я, уже устал отсылать, да и модеры форума, сочтут это не корректным. Поищитен в поисковиках, заключённое в скобки.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума
Старый 09.02.2014, 21:13   #4
Dalmar2008
 
Регистрация: 09.02.2014
Сообщений: 4
По умолчанию

ViktorR, огромное вам спасибо, тему можно закрывать
Dalmar2008 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь в составлении программы Stary Помощь студентам 5 09.11.2009 09:04
Очень нужна помощь с написанием программы... срочно(буду благодарен за помощь) 5Paladin5 Помощь студентам 3 02.07.2009 09:12
Нужна помощь с доработкой.двусвязный список(С++).Удалить ел-т в заданой позиции. Olya90 Помощь студентам 1 28.05.2009 00:14
нужна помощь - 2 программы в С++ Nemisoi Фриланс 1 22.04.2008 23:10