С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/55: Рейтинг темы: голосов - 55, средняя оценка - 4.56
-3 / 3 / 0
Регистрация: 10.03.2019
Сообщений: 108
1

Определить минимальное время за которое гости закончат есть свои блины после перекладывания части блинов

18.03.2019, 23:08. Показов 11050. Ответов 29

Author24 — интернет-сервис помощи студентам
Здравствуйте. Встретилась непонятная задачка на informatics. Условие так себе понятно,а вот как решить совсем не получается. Пожалуйста помогите.

Условие:
Мы все знаем, что начавшаяся зима скоро закончится, и на праздновании Масленицы все будут есть блины. Об этом и будет наша задача.

N гостей сидят за столом, и перед каждым стоит тарелка с блинами. На тарелке i-го гостя лежит ai блинов. Каждый гость съедает один блин за одну минуту, таким образом, время, когда закончит есть блины последний человек, равно наибольшему значению из ai.

Неожиданно к ним присоединился ещё один человек, и теперь все присутствующие могут переложить часть своих блинов (в том числе могут переложить все свои блины, а могут не перекладывать ни одного блина) вновь пришедшему человеку. Перекладывание блинов происходит одновременно и моментально.

Гости хотят переложить блины таким образом, чтобы после перекладывания они съели все блины за минимальное время (которое равно наибольшему числу блинов на тарелках у гостей, включая нового гостя). Определите, за какое наименьшее время гости смогут съесть свои блины после перекладывания.

Программа получает на вход натуральное число N, не превосходящее 100.000, – первоначальное количество гостей. Следующие N строк содержат натуральные числа ai – количество блинов на тарелке i-го человека. Значения ai даны в порядке не убывания, то есть ai ai+1. Сумма значений всех ai не превосходит 2109.

Программа должна вывести одно целое число – минимальное время, за которое все гости закончат есть свои блины после перекладывания части блинов на тарелку нового гостя.

Пояснение к примеру
За столом сидят 4 человека, у них на тарелках 1, 3, 5, 6 блинов. Новому гостю последний гость отдаст 2 блина, а предпоследний – 1 блин, и тогда у всех, включая нового гостя, будет не более 4 блинов.

Примеры
входные данные
4
1
3
5
6
выходные данные
4
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.03.2019, 23:08
Ответы с готовыми решениями:

Минимальное время, за которое гости съедят блины
Всем доброго времени суток! N гостей сидят за столом, и перед каждым стоит тарелка с блинами. На...

Определить минимальное количество переправ, которое придется совершить во время похода
№4. Поход Группа школьников решила сходить в поход вдоль реки-Иртыш. У реки-Иртыш существует...

Определить минимальное время, через которое может произойти встреча всех роботов
Задача: Между N пунктами (N<=50) заданы дороги длиной A(i,j), где I,J-номера пунктов. Дороги...

Как найти минимальное время которое удовлетворяет условие?
Входные данные В первой строке заданы два целых числа N и K (1 ≤ N ≤ 100 –...

29
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
20.03.2019, 12:41 21
Author24 — интернет-сервис помощи студентам
IGPIGP, моделирование? Способ хорош тем, что он понятен и наиболее близок к тому, как бы поступили реальные люди в такой ситуации. Нереальным его делают безжалостные цифры: на самом деле в оригинальном тексте задания упоминается не 2109, а https://www.cyberforum.ru/cgi-bin/latex.cgi?2 \cdot 10^9 блиноединиц.

Не по теме:

Только представьте, какой будет стопка блинов единственного гостя в худшем случае. Если принять толщину блиноединицы в 1мм, полученные 2000км моментально сорвут крышу дома. Несчастный гость соберет все лестницы в округе, чтобы забраться на самый верх и скидывать оттуда по одному блину для опоздавшего. А потом их ждет сытный ужин и неизбежный throw StomachOverflowException xD



Что-то я отвлекся. При таких количествах блиноединиц перекладывать по одной получится долго. IGPIGP, спасибо Вам за подробное описание, теперь стало понятно, как ваша программа решает задачу, и стала понятна причина TLE (превышение времени выполения). А ТС - жирный минус за неточную формулировку задания.

Добавлено через 26 минут
SivaMore, вы немного опоздали: готовые решения у меня закончились несколько дней назад, а новая партия задерживается на неопределённый срок (поставщик оказался ненадёжным). Теперь остаётся ждать, когда CyberNinjaProg поделится с нами своим кодом, или может быть, кто-нибудь другой пожелает решить эту хитрую задачу.
1
Комп_Оратор)
Эксперт по математике/физике
8977 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.03.2019, 14:21 22
Цитата Сообщение от valen10 Посмотреть сообщение
Несчастный гость соберет все лестницы в округе, чтобы забраться на самый верх и скидывать оттуда по одному блину для опоздавшего.
В задаче крышу блин срывает. Буквально.
Цитата Сообщение от valen10 Посмотреть сообщение
При таких количествах блиноединиц перекладывать по одной получится долго.
Я не вчитался в момент, каюсь:
Цитата Сообщение от CyberNinjaProg Посмотреть сообщение
все присутствующие могут переложить часть своих блинов (в том числе могут переложить все свои блины, а могут не перекладывать ни одного блина) вновь пришедшему человеку. Перекладывание блинов происходит одновременно и моментально.
Зато достаточно наглядно, но теперь ясно что нужно разность пополам делить.
В общем объедятся они. Как пить дать.
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
20.03.2019, 15:41 23
CyberNinjaProg, особо не тестил, но можете попробовать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
using namespace std;
int main()
{
    size_t N;
    cin >> N;
    size_t* arr = new size_t[N];
    for (size_t i(0); i < N; ++i) cin >> arr[i];
    size_t count(N - 1);
    size_t result = 0;
    for (; count > 0 && result < arr[count]; --count) result += arr[count] - arr[count - 1];
    size_t sum = 0;
    for (size_t i(count + 1); i < N; ++i) sum += arr[i];
    result = sum / (N - count);
    if (sum > result*(N - count)) result += 1 + (sum - result * (N - count)) / (N - count);// "(sum - result * (N - count)) / (N - count)" возможно лишнее
    cout << result;
}
0
-3 / 3 / 0
Регистрация: 10.03.2019
Сообщений: 108
20.03.2019, 19:34  [ТС] 24
Спасибо, но не все прошло есть неправильные ответы....
Миниатюры
Определить  минимальное время за которое гости закончат есть свои блины после перекладывания части блинов  
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
20.03.2019, 20:19 25
Лучший ответ Сообщение было отмечено CyberNinjaProg как решение

Решение

подправил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
int main()
{
    int N;
    cin >> N;
    int* arr = new int[N];
    for (int i(0); i < N; ++i) cin >> arr[i];
    int count(N - 1);
    int result = 0;
    for (; count >= 0 && result < arr[count]; --count) {
        if (count > 0) result += arr[count] - arr[count - 1];
    }
    int sum = 0;
    for (int i(count + 1); i < N; ++i) sum += arr[i];
    result = sum / (N - count);
    if (sum > result*(N - count)) ++result;
    cout << result;
}
1
-3 / 3 / 0
Регистрация: 10.03.2019
Сообщений: 108
20.03.2019, 20:43  [ТС] 26
ВСЕ прошло. ОГРОМНОЕ ВАМ СПАСИБО!
0
Комп_Оратор)
Эксперт по математике/физике
8977 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.03.2019, 23:45 27
Цитата Сообщение от CyberNinjaProg Посмотреть сообщение
ВСЕ прошло. ОГРОМНОЕ ВАМ СПАСИБО!
CyberNinjaProg, а где вы нашли задание и где можно его решение протестировать?
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
21.03.2019, 00:01 28
IGPIGP, тут. Гуглится по слову informatics и началу задания.
1
Комп_Оратор)
Эксперт по математике/физике
8977 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.03.2019, 00:41 29
valen10, спасибо)
0
0 / 0 / 0
Регистрация: 13.04.2021
Сообщений: 1
13.04.2021, 19:58 30
А можете эту же задачу на Пейтоне решить, пожалуйста?
0
13.04.2021, 19:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.04.2021, 19:58
Помогаю со студенческими работами здесь

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

Определяющую минимальное время, которое необходимо для обработки всех кубиков
Необходимо решить задачу по олимпиаде по информатике и сказали что я буду учавствовать а я угу в...

Найти минимальное время, за которое автомобиль перевезет три груза со склада в магазин и вернется назад
Имя входного файла: input.txt Имя выходного файла: output.txt Маша помогает папе в разработке...

Апостериорная вероятность после перекладывания шаров
В первой урне лежат два белых шара и четыре черных, а во второй 3 белых и 2 черных. Из первой урны...

Определить минимальное число пирамид которое требуется сложить
Капитан Вася всегда держит на своем корабле запас пушечных ядер для борьбы с пира- тами. Так как...

Закрытие программы только после того, как работу закончат все потоки
У меня есть 30 потоков, обычные threads, их 30 штук. Каждый поток выполняет определенный алгоритм....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru