Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Здесь нужно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 26.12.2018, 16: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, 16:52   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,069
По умолчанию

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, 17:04   #3
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,049
По умолчанию

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

И собственно проверка:
Код:
    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, 01:13   #4
ViktorR
Участник клуба
 
Регистрация: 23.10.2010
Сообщений: 1,381
По умолчанию

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

Или я что-то не так понял?
Как-то так, ...
ViktorR вне форума   Ответить с цитированием
Старый 27.12.2018, 13: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, 13: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, 13:06   #7
kim-im
Пользователь
 
Регистрация: 07.11.2017
Сообщений: 42
По умолчанию

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

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

Код:
a:array[-999999..999999] of longint;   //зачем?
Код:
a:array[1..99999] of longint;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума   Ответить с цитированием
Старый 27.12.2018, 13: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, 13:41   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,069
По умолчанию

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
молодежь уже не помнит, но раньше в скобочках в интернетах писали пояснение и сразу было понятно, что это дети Alar Свободное общение 60 10.04.2018 23:40
Найти вероятность того что, со 100 рожденных детей мальчиков и девочек одинаковое количество - Статистика, теория вероятностей Max00766 Помощь студентам 3 10.04.2016 18: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


05:22.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.