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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2018, 15:41   #1
kim-im
Пользователь
 
Регистрация: 07.11.2017
Сообщений: 42
По умолчанию Дети в лесу собирали грибы. Коля не нашел ни одного гриба. Дети были вежливы и они решили что каждый подарит Коле одинаковое количество грибов.

Прошу помощи в решении задачи. Проходит лишь на 58%.
Условие:
Дети в лесу собирали грибы. Коля не нашел ни одного гриба. Дети были вежливы и они решили что каждый подарит Коле одинаковое количество грибов. Но отдавать без определенного плана никто не хотел. Тогда решили, что каждый из детей отдает одинаковое наименьшее количество грибов, но чтобы в сумме в Коле получилось больше грибов, чем у любого из детей останется. Необходимо выяснить возможно ли это, и по сколько грибов будет получать Коля от каждого из детей.

Входные данные:

В первой строке записано число N (1 ≤ N ≤ 105) - количество друзей, которые собирали грибы, во второй строке записано N-1 чисел Ai (1≤Ai≤109), количество грибов, которые нашел каждый из детей.

Исходные данные:

Одно число - количество грибов которые получит Коля от каждого из детей, или -1, если это не возможно сделать.

Мой код:
Код:
var n,i,max,min,k:longint;
    a:array[-9999..9999] of longint;
begin
 read (n);
  for i:=1 to n-1 do
   begin
    read(a[i]);
   end;
  max:=a[1];
  min:=a[1];
   for i:=1 to n-1 do
    begin
     if a[i]>max then max:=a[i];
    end;
    
   for i:=1 to n-1 do
    begin
     if a[i]<min then min:=a[i];
    end;
    
    for i:=1 to min do
    begin
    k:=i*n-1;
     if k>max then break;
    end;
    if k<=max then write ('-1') else write (i);
  end.
kim-im вне форума Ответить с цитированием
Старый 26.12.2018, 15:52   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

0. Как из 105 - 1 получилось 109?
1. Зачем вам массив почти на 20000 элементов, когда детей 105?
2. Зачем еще раз пробегать по масиву в поисках максимума? Или сразу искать, или если бежать, то сразу сравнивать с кол-вом и делать брек.
3.
Код:
     for i:=1 to min do
    begin
    k:=i*n-1;
     if k>max then break;
    end;
Что вы этим хотели сделать? У Коли кол-во грибов вычисляется один раз по формуле и сравнивается с максимумом.
p51x вне форума Ответить с цитированием
Старый 26.12.2018, 16:04   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Минимум и максимум можно и нужно в одном цикле вычислять, а не плодить циклы.

И собственно проверка:
Код:
    k:=-1;
    for i:=1 to min do if i*(n-1)>max-i then begin k:=i; break; end;
    write (k);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.12.2018, 00:13   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Маленькое замечание.
Так думаю, что у кого то из детей должен остаться хотя бы один гриб.
Т.е. цикл должен быть не до min, а до min - 1.

Или я что-то не так понял?
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 27.12.2018, 12:02   #5
kim-im
Пользователь
 
Регистрация: 07.11.2017
Сообщений: 42
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
0. Как из 105 - 1 получилось 109?
1. Зачем вам массив почти на 20000 элементов, когда детей 105?
2. Зачем еще раз пробегать по масиву в поисках максимума? Или сразу искать, или если бежать, то сразу сравнивать с кол-вом и делать брек.
3.
Код:
     for i:=1 to min do
    begin
    k:=i*n-1;
     if k>max then break;
    end;
Что вы этим хотели сделать? У Коли кол-во грибов вычисляется один раз по формуле и сравнивается с максимумом.
Извините:
0. Я допустил грубейшую ошибку. в задании нужно так:
N(1 ≤ N ≤ 10 в 5 степени)
также Ai(1≤Ai≤10 в 9 степени)
kim-im вне форума Ответить с цитированием
Старый 27.12.2018, 12:05   #6
kim-im
Пользователь
 
Регистрация: 07.11.2017
Сообщений: 42
По умолчанию

Большое всем спасибо
Код рабочей программы:
Код:
var n,i,max,min:int64;
    a:array[-999999..999999] of longint;
    k:int64;
begin
 read (n);
  for i:=1 to n-1 do
   begin
    read(a[i]);
   end;
 
 max:=a[1];
 min:=a[1];
  for i:=1 to n-1 do
   begin
    if a[i]>max then
       max:=a[i];
    if a[i]<min then
       min:=a[i];
    end;
    
    k:=-1;
     for i:=1 to min do
      if i*(n-1)>max-i then 
       begin 
        k:=i;
        break;
       end;
    write (k);
  end.
kim-im вне форума Ответить с цитированием
Старый 27.12.2018, 12:06   #7
kim-im
Пользователь
 
Регистрация: 07.11.2017
Сообщений: 42
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Маленькое замечание.
Так думаю, что у кого то из детей должен остаться хотя бы один гриб.
Т.е. цикл должен быть не до min, а до min - 1.

Или я что-то не так понял?
В принципе в условии это нигде не указано
kim-im вне форума Ответить с цитированием
Старый 27.12.2018, 12:20   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
a:array[-999999..999999] of longint;   //зачем?
Код:
a:array[1..99999] of longint;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.12.2018, 12:34   #9
kim-im
Пользователь
 
Регистрация: 07.11.2017
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код:
a:array[-999999..999999] of longint;   //зачем?
Код:
a:array[1..99999] of longint;
А не знаю. Я в задачах на большие типы всегда так пишу и все проходит.
И не можете ли подсказать
Код:
if i*(n-1)>max-i then
почему здесь именно >max-i а не >max?
kim-im вне форума Ответить с цитированием
Старый 27.12.2018, 12:41   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от kim-im Посмотреть сообщение
А не знаю. Я в задачах на большие типы всегда так пишу и все проходит.
А потом калькулятору надо гиг памяти для сложения...

Цитата:
Сообщение от kim-im Посмотреть сообщение
почему здесь именно >max-i а не >max?
Потому что
Цитата:
Сообщение от kim-im Посмотреть сообщение
но чтобы в сумме в Коле получилось больше грибов, чем у любого из детей останется.
p51x вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
молодежь уже не помнит, но раньше в скобочках в интернетах писали пояснение и сразу было понятно, что это дети Alar Свободное общение 60 10.04.2018 22:40
Найти вероятность того что, со 100 рожденных детей мальчиков и девочек одинаковое количество - Статистика, теория вероятностей Max00766 Помощь студентам 3 10.04.2016 17:26
Дети Индиго Индиго-77 Свободное общение 18 09.11.2013 20:13
Отцы и дети Granus Общие вопросы C/C++ 0 12.04.2011 16:51
Отцы и дети, MDIParent и MDIChild r00xus Общие вопросы Delphi 0 11.04.2009 12:26