25 / 14 / 2
Регистрация: 28.06.2020
Сообщений: 50

Вырубка леса

05.08.2020, 02:36. Показов 10967. Ответов 8

Студворк — интернет-сервис помощи студентам
Фермер Николай нанял двух лесорубов: Дмитрия и Федора, чтобы вырубить лес, на месте которого должно быть кукурузное поле. В лесу растут X деревьев.

Дмитрий срубает по A деревьев в день, но каждый K-й день он отдыхает и не срубает ни одного дерева. Таким образом, Дмитрий отдыхает в K-й, 2K-й, 3K-й день, и т.д.

Федор срубает по B деревьев в день, но каждый M-й день он отдыхает и не срубает ни одного дерева. Таким образом, Федор отдыхает в M-й, 2M-й, 3M-й день, и т.д.

Лесорубы работают параллельно и, таким образом, в дни, когда никто из них не отдыхает, они срубают A+B деревьев, в дни, когда отдыхает только Федор — A деревьев, а в дни, когда отдыхает только Дмитрий — B деревьев. В дни, когда оба лесоруба отдыхают, ни одно дерево не срубается.

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

Требуется написать программу, которая по заданным целым числам A, K, B, M и X определяет, за сколько дней все деревья в лесу будут вырублены.

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

Входные данные содержат пять целых чисел, разделенных пробелами: A, K, B, M и X (1≤A,B≤109 , 2≤K,M≤1018, 1≤X≤1018).

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

Выведите одно целое число — искомое количество дней.

Пояснения к примеру

В приведенном примере лесорубы вырубают 25 деревьев за 7 дней следующим образом:

1-й день: Дмитрий срубает 2 дерева, Федор срубает 3 дерева, итого 5 деревьев;
2-й день: Дмитрий срубает 2 дерева, Федор срубает 3 дерева, итого 10 деревьев;
3-й день: Дмитрий срубает 2 дерева, Федор отдыхает, итого 12 деревьев;
4-й день: Дмитрий отдыхает, Федор срубает 3 дерева, итого 15 деревьев;
5-й день: Дмитрий срубает 2 дерева, Федор срубает 3 дерева, итого 20 деревьев;
6-й день: Дмитрий срубает 2 дерева, Федор отдыхает, итого 22 дерева;
7-й день: Дмитрий срубает 2 дерева, Федор срубает оставшееся 1 дерево, итого все 25 деревьев срублены.
Примеры
Ввод
Вывод
2 4 3 3 25
7
Вот мой код, он работает, но превышает время работы
Python
1
2
3
4
5
6
7
8
9
10
11
12
a, k, b, m, x = map(int, input().split())
days = 0
while x > 0:
    days += 1
    if days % k != 0 and days % m == 0:
        x -= a
    elif days % m != 0 and days % k == 0:
        x -= b
    elif days % m != 0 and days % k != 0:
        x -= a
        x -= b
print(days)
Помогите пожалуйста ускорить, хотя бы совет каким способом/алгоритмом перерешать, спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.08.2020, 02:36
Ответы с готовыми решениями:

Вырубка Леса
Есть такая задача, условие ниже. У меня получилось ее решить, но способом "в лоб". Большинство контестов проходит, но все же есть...

Определите, в какой точке нужно пересечь границу леса и поля, чтобы как можно быстрее добраться из точки А в точку Б
осталась еще одна программа для зачета, никак не могу разобраться Рассмотрим карту, левый нижний угол которой имеет координаты (0; 0), а...

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

8
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,318
05.08.2020, 05:15
Обычный бинарный поиск с функцией ОК:
Python
1
2
OK = (a * (M - M//k) + b * (M - M//m)
if OK < x :
2
25 / 14 / 2
Регистрация: 28.06.2020
Сообщений: 50
05.08.2020, 11:50  [ТС]
Gdez, спасибо большое за совет, все прошло)
Вот код, если кому нужно
Python
1
2
3
4
5
6
7
8
9
10
a, k, b, m, x = map(int, input().split())
L = 0
R = x
while R - L > 1:
    M = (R + L) // 2
    if a * (M - M //k) + b * (M - M // m) < x:
        L = M
    else:
        R = M
print(R)
1
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,318
05.08.2020, 11:54
Rorik, идеи с "Субботником" есть?
0
25 / 14 / 2
Регистрация: 28.06.2020
Сообщений: 50
05.08.2020, 13:05  [ТС]
пока нет(
Но вот нашёл решение на С++ и оно работает, осталось переписать, надеюсь получится
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <bits/stdc++.h>
 
using namespace std;
 
int n,t,c;
   
int check(int k,int a[])
{
    int kol=0,i=1;
    while(i<=n-c+1)
    if(a[i+c-1]-a[i]<=k)
    {
        kol++;
        i=i+c;
    }
        else i++;
    if(kol>=t) return 1;
    else return -1;
   
}
 
int main()
{
    int i,m,r,l,min;
    scanf("%d%d%d",&n,&t,&c);
    int a[n+1];
    for(i=1;i<=n;i++)
    scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    if(n==c)
    {
        printf("%d",a[n]-a[1]);
        return 0;
    }
    l=0;
    r=a[n]-a[1];
    min=r;
    while(l<r)
    {
        m=(l+r)/2;
        if(check(m,a)>0)
        {
            r=m;   
            if(m<min) min=m;
        }
       
        else l=m+1;
    }
    printf("%d",min);
    return 0;
}
1
17 / 17 / 0
Регистрация: 16.06.2020
Сообщений: 24
05.08.2020, 13:12
Gdez, есть на С++ Задача "Субботник"
Она принимается.

Попробовал переписать:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
def check(k, a):
    kol = 0
    i = 1
    while i < (n - c + 1):
        if (a[i+c-1]-a[i]) <= k:
            kol += 1
            i += c
        else:
            i +=1
    if kol >= t:
        return 1
    else:
        return -1
 
n, t, c = map(int, input().split())
a = []
 
for i in range(n):
    a.append(int(input()))
a.append(0)
a.sort()
 
if n == c:
    print(0)
else:
    l = 0
    r = a[n] - a[1]
    minimum = r
    while l < r:
        m = (l + r) // 2
        if check(m,a) > 0:
            r = m
            if m < minimum:
                minimum = m
        else:
            l = m + 1
            
    print(minimum)
Сириус не принимает (неправильный ответ)
0
25 / 14 / 2
Регистрация: 28.06.2020
Сообщений: 50
05.08.2020, 13:15  [ТС]
StillCF, Возможно, Вы допустили где-то ошибку, но я сам не вижу её
0
17 / 17 / 0
Регистрация: 16.06.2020
Сообщений: 24
05.08.2020, 13:52
Rorik, Нашел свою ошибку в 4 строке <=
Вот правильно
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def check(k, a):
    kol = 0
    i = 1
    while i <= (n - c + 1):
        if (a[i+c-1]-a[i]) <= k:
            kol += 1
            i += c
        else:
            i += 1
    if kol >= t:
        return 1
    else:
        return -1
 
n, t, c = map(int, input().split())
 
a = [0]
for i in range(n):
    a.append(int(input()))
a.sort()
 
 
l = 0
r = a[n] - a[1]
minimum = r
while l < r:
    m = (l + r) // 2
    if check(m,a) > 0:
        r = m
        if m < minimum:
            minimum = m
    else:
        l = m + 1
        
print(minimum)
2
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,318
05.08.2020, 14:11
Спасибо
Мне нужна была функция ОК
Из кода понял ее реализацию)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.08.2020, 14:11
Помогаю со студенческими работами здесь

Вырубка леса
Вырубка леса Автор: Центральная предметно-методическая комиссия по информатике Входной файл: forest.in Ограничение времени на...

Вырубка деревьев
Король Флатландии решил вырубить некоторые деревья, растущие перед его дворцом. Деревья перед дворцом короля посажены в ряд, всего там...

Вырубка деревьев
Ребят, привет! Помогите, пожалуйста!!! Переведите код с С++ на .NET. Спасибо!!! var n, m : longint; i, d, s : longint; ...

Вырубка деревьев. Портировать C++ на C#
Всем привет! Помогите, пожалуйста, переведите код с С++ на C#. Очень буду благодарен. #include &lt;fstream&gt; using namespace std; ...

Сократить код ( Вырубка деревьев (Время: 1 сек. Память: 16 Мб Сложность: 46%)
всем привет решил написать код от 24-ой задачи с acmp.ru вот код #include &lt;fstream&gt; int main(){ std::fstream...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru