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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2016, 22:02   #1
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
По умолчанию Кто тут крутой программист? Зайди сюда)

Привет, читающий. Вообщем столкнулся с олимпиадной задачкой, вот она:

Для строительства двухмерной пирамиды используются прямоугольные блоки, каждый из которых характеризуется шириной и высотой. Можно поставить один блок на другой, только если ширина верхнего блока строго меньше ширины нижнего. Самым нижним в пирамиде может быть блок любой ширины.

По заданному набору блоков требуется определить, пирамиду какой наибольшей высоты можно построить из них.


Формат входных данных

В первой строке входных данных задается число N – количество блоков (1 <=N<=100000 ).
В следующих N строках задаются пары целых чисел ширина и высота, разделенные пробелом – ширина и высота блока, соответственно.


Формат выходных данных

Целое число – максимальная высота пирамиды.

Пример

стандартный ввод

3
3 1
2 2
3 3

стандартный вывод

5

Замечание

В приведенном примере пирамида будет состоять из двух блоков: нижним будет блок с номером 3, а верхним – блок с номером 2. Блок с номером 1 нельзя использовать для строительства пирамиды, т.к. его ширина совпадает с шириной нижнего блока.

Код:
program piramida;
      var N,i,j,maxw,z,maxh,sumheight:integer;
        a,wid,hei:array[1..100000] of integer;
begin
  sumheight:=0; j:=1;
  //---Ввод информации----------------------//
  readln (N);
  for i:=1 to N do
      read(wid[i],hei[i]);
  write ('------------------------');
  writeln;
  //----------------------------------------//
  maxw:=wid[1];
  maxh:=0;
  i:=1;
  repeat
  for i:=1 to N do     //находим максимальную ширину
      if wid[i]>maxw then  begin
         maxw:=wid[i];
      end;
  for i:=1 to N do     {*из нескольких максимальных ширин находим
                       максимальную высоту, запоминаем номера всех
                       максимальных ширин*}
      if wid[i]=maxw then begin
         a[j]:=i;
         z:=j;
         j:=j+1;
         if hei[i]>maxh then
            maxh:=hei[i];
      end;
  sumheight:=sumheight+maxh;  //суммируем высоты
  for j:=1 to z do begin     //удаляем все использованные блоки 
    i:=a[j];
    wid[i]:=wid[i+1];
    while i<N-1 do begin
      i:=i+1;
      wid[i]:=wid[i+1];
    end;
    N:=N-1;
  end;
  maxw:=wid[1];
  maxh:=0;
  i:=1;
  j:=1;
  until N=0;
  //---Вывод информации-------------------------//
writeln;
writeln ('------------------------');
write ('Максимальная высота = ',sumheight);
readln;
readln;
end.
Мне бы мою программку изменить так, чтобы вместо 4 выводило 5, ибо я не знаю, в чем здесь ошибка, собственно...

--------------------------------

Вообщем, отчасти разобрался. Я удаляю все блоки только по ширине. Номера высоты остаются прежние. И на выводе при проверке ширину блоков он выдает правильную, в высоте же ошибка. Осталось понять, как удалять еще и номера использованной высоты, ну или как-то присваивать номерам высоты - ширину.. Не знаю, насколько понятна вся эта ахинея выше =)

Последний раз редактировалось NikiToZz_; 01.06.2016 в 22:41.
NikiToZz_ вне форума Ответить с цитированием
Старый 01.06.2016, 22:46   #2
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
По умолчанию

Кароче говоря, сделал сам) Если кому интересно - разбирайтесь..
Код:
program piramida;
      var N,i,j,maxw,z,maxh,sumheight:integer;
        a,wid,hei:array[1..100000] of integer;
begin
  sumheight:=0; j:=1;
  //---Ввод информации----------------------//
  readln (N);
  for i:=1 to N do
      read(wid[i],hei[i]);
  write ('------------------------');
  writeln;
  //----------------------------------------//
  maxw:=wid[1];
  maxh:=0;
  i:=1;
  repeat
  for i:=1 to N do     //находим максимальную ширину
      if wid[i]>maxw then  begin
         maxw:=wid[i];
      end;
  for i:=1 to N do     {*из нескольких максимальных ширин находим
                       максимальную высоту, запоминаем номера всех
                       максимальных ширин*}
      if wid[i]=maxw then begin
         a[j]:=i;
         z:=j;
         j:=j+1;
         if hei[i]>maxh then
            maxh:=hei[i];
      end;
 // writeln (maxw:4);
 // writeln (maxh:3);
  sumheight:=sumheight+maxh;  //суммируем высоты
  for j:=1 to z do begin     //удаляем все использованные блоки
    i:=a[j];
    wid[i]:=wid[i+1];
    hei[i]:=hei[i+1];
    while i<N-1 do begin
      i:=i+1;
      wid[i]:=wid[i+1];
      hei[i]:=hei[i+1];
    end;
    N:=N-1;
  end;
  maxw:=wid[1];
  maxh:=0;
  i:=1;
  j:=1;
  until N=0;


 
  //---Вывод информации-------------------------//
writeln;
writeln ('------------------------');
write ('Максимальная высота = ',sumheight);
readln;
readln;
end.
NikiToZz_ вне форума Ответить с цитированием
Старый 01.06.2016, 22:53   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

вообще-то я дворник. зашёл поглазеть на незнакомые букофки. не обращайте на меня внимания.

ой, нумерация массива не с нуля! аяйяй
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 01.06.2016, 22:58   #4
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
По умолчанию

min@y™, а разница?
NikiToZz_ вне форума Ответить с цитированием
Старый 01.06.2016, 23:55   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
а разница?
чо ты у меня-то спрашиваешь? я же дворник, у меня и компа-то отродясь не было.
ща гуры подгребут, их спроси, они умные.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 02.06.2016, 00:34   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
чо ты у меня-то спрашиваешь? я же дворник, у меня и компа-то отродясь не было.
ща гуры подгребут, их спроси, они умные.
Я уже туточки. Меня смутило вот это безобразие - array[1..100000] of integer;. Нахрена ему такой массив в сто тысяч элементов? Он чё решил закончить жизнь самоубийством, вводя туда данные?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 02.06.2016, 03:53   #7
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

1- если в дальнейшем правильно работать с индексами массива, то нумерация с какого элемента не имеет значения, хоть с 100.
2- статический массив хорош тем, что выделение памяти происходит сразу же и экономится время по ходу программы.
3- 100 000 мелочи ) Может его консоль юзает другая утилита и набивает данные :D

Последний раз редактировалось kutani; 02.06.2016 в 03:56.
kutani вне форума Ответить с цитированием
Старый 02.06.2016, 08:20   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

У меня такое впечателение, что первый пост вообще никто не читал!

исходное задание такое:
Цитата:
В первой строке входных данных задается число N – количество блоков (1 <=N<=100000 ).
Таким образом может быть во входном файле 100000 записей о блоках. Их нужно обработать. Вот для них и создан данный массив.
Не понимаю, о чём сыр-бор?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.06.2016, 08:28   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Не понимаю, о чём сыр-бор?!
В отсутствии смысла существования темы.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 02.06.2016, 11:44   #10
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
В отсутствии смысла существования темы.
Изначально был смысл, так та.. =)
NikiToZz_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Если ты крутой девелопер, тебе сюда! JHunter Свободное общение 4 01.12.2011 21:02
Кто знает алгоритмы сюда))) PashAs Помощь студентам 4 23.03.2009 18:02
Кто работает кодером..СЮДА! Elm0 Свободное общение 4 24.05.2007 10:22