Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 251
#1

Найти минимальное время, за которое можно поджарить все котлеты - C++

10.07.2015, 16:36. Просмотров 1293. Ответов 29
Метки нет (Все метки)

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

Кликните здесь для просмотра всего текста
На сковородке одновременно можно положить k котлет. Каждую котлету нужно с каждой стороны обжаривать m минут непрерывно. За какое наименьшее время удастся поджарить с обеих сторон n котлет?

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

В единственной строке входного файла INPUT.TXT записано три натуральных числа: k, m, n, не превышающих 30000.

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

В единственную строку выходного файла OUTPUT.TXT нужно вывести единственное число – минимальное время, за которое можно поджарить все котлеты.


Собственно, задача вроде бы простая, но выдаёт ошибки на разных тестах. Нашёл 2 теста: k = 2, m =1, n = 3 и ответ равен 3 - это правильно или нет? Мне кажется, что должен быть равен 4-м. Также точно ещё числа: k = 99, m = 100, n 100. Ответ теста = 300. Корректны ли тесты? Мой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main()
{
    int k, m, n;
    cin >> k >> m >> n;
    if (k == 0 || m == 0 || n == 0)
        cout << 0 << endl;
    int counter = 0;
    while (n > 0)
    {
        n -= k;
        counter += m * 2;
    }
    cout << counter << endl;
        return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2015, 16:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Найти минимальное время, за которое можно поджарить все котлеты (C++):

Найти минимальное количество шариков, которое необходимо перекрасить, чтобы все шарики были одного цвета - C++
Написал код для одной задачи. Ответ выдает он вроде правильный. Но на сайте при тестировании моего алгоритма, он проходит тест на 31%...

Найти минимальное количество купюр, которое необходимо использовать, чтобы выдать сумму в n гривен - C++
В банкомате имеются в достаточном количестве купюры номиналом 10, 20, 50, 100, 200 и 500 гривен. Найти минимальное количество купюр,...

Требуется по начальному расположению деталей на первом конвейере определить время, через которое все детали будут изготовлены - C++
Совсем не могу разобраться в программе помогите пожалуйста. Имеются три конвейера. Конвейеры работают независимо друг от друга....

Алгоритм(Найти максимальное совершенное число, которое в то же время меньше введенного N) - C++
Найти максимальное совершенное число, которое в то же время меньше введенного N Справка: Число называется совершенным, если оно...

Графы, найти минимальное время, необходимое для выполнения всех задач - C++
Граф представлен в виде списка смежных. Есть множество задач T1, T2, …, Tn, для выполнения которых необходимо время t1, t2, …, tn...

Найти минимальное время, необходимое для получения N копий одного документа на двух ксероксах - C++
Добрый день, нашёл задачку, нужно решить её методом бинарного поиска ( если будут другие варианты, то тоже спасибо ). Вот сама задачка: ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
D_Gon
23 / 12 / 5
Регистрация: 09.07.2015
Сообщений: 47
10.07.2015, 16:47 #2
Непонятно что n и что k, но неважно

00 - обе стороны не жарены
01 или 10 - одна сторона прожарена
11 - обе стороны прожарены

Пусть время 1:

котлеты k = 3;
на сковороде помещается n = 2;

0. 00 | 00 | 00
1. 01 | 01 | 00
2. 11 | 01 | 01
3. 11 | 11 | 11

я бы держал 3 переменных с количеством нежареных полупрожареных и жареных котлет
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
10.07.2015, 17:01 #3
Цитата Сообщение от Melvil Посмотреть сообщение
Нашёл 2 теста: k = 2, m =1, n = 3 и ответ равен 3 - это правильно или нет?
да
D_Gon, уже показал, а я напишу словами
кладем две котлеты
жарим 1 минуту
через минуту у нас две котлеты, поджаренные с одной стороны, одна нежареная
переворачиваем одну котлету, вторую вынимаем ,кладем третью
через минуту у нас две котлеты, поджаренные с одной стороны, одна готова
кладем эти две котлеты
и через минуту у нас все три котлеты готовы
вот в таком вот разрезе
формально это можно записать так
3 котлеты 6 сторон
одновременно жарятся 2 стороны
6/2=3 минуты

Добавлено через 4 минуты
Цитата Сообщение от Melvil Посмотреть сообщение
k = 99, m = 100, n 100.
100 котлет 200 сторон
200/99=2.02
округляем к ближайшему большему 3
3 подхода по 100 минут =300 минут
Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 251
10.07.2015, 17:19  [ТС] #4
Цитата Сообщение от ValeryS Посмотреть сообщение
округляем к ближайшему большему 3
Не очень понял почему к ближайшему большему, но вот со сторонами всё понятно, спасибо.

Добавлено через 13 минут
Цитата Сообщение от D_Gon Посмотреть сообщение
я бы держал 3 переменных с количеством нежареных полупрожареных и жареных котлет
Интересно было бы увидеть ваш вариант решения.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
10.07.2015, 17:22 #5
Цитата Сообщение от Melvil Посмотреть сообщение
Не очень понял почему к ближайшему большему,
потому что дискретность 1(сторона) ты не можешь поджарить 0.02 стороны
Цитата Сообщение от Melvil Посмотреть сообщение
но вот со сторонами всё понятно,
давай сторонами
кладем 99 котлет 100 минут
98 переворачиваем одну вынимаем, кладем сырую 100 минут
вынимаем 98 готовых, дожариваем оставшиеся 2 100 минут
теперь понятно откуда взялось 0.02 и почему его нужно округлить до 1 ?
Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 251
10.07.2015, 17:27  [ТС] #6
Цитата Сообщение от ValeryS Посмотреть сообщение
теперь понятно откуда взялось 0.02 и почему его нужно округлить до 1 ?
Вполне. Только вот задача теперь вместо 3-го теста выдает ошибку на втором:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{
    double k, m, n;
    int result;
    cin >> k >> m >> n;
    if (k == 0 || m == 0 || n == 0)
    {
        cout << 0 << endl;
    }
    result = ceil((n * 2) / k);
    cout << result * m << endl;
}
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
10.07.2015, 17:31 #7
Цитата Сообщение от Melvil Посмотреть сообщение
Только вот задача теперь вместо 3-го теста выдает ошибку на втором:
тест приведи, проверим
Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 251
10.07.2015, 17:34  [ТС] #8
Цитата Сообщение от ValeryS Посмотреть сообщение
тест приведи, проверим
Не знаю как просматривать тесты, но одну нашёл:
k = 2, m = 2, n = 1
По этой формуле ответ выходит 2, а на самом деле = 4.
D_Gon
23 / 12 / 5
Регистрация: 09.07.2015
Сообщений: 47
10.07.2015, 18:01 #9
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
#include <iostream>
using namespace std;
 
int main()
{
    int k, m, n;//я принял k - вместимость n - число котлет
    cin >> k >> m >> n;
    if (k == 0 || m == 0 || n == 0)
        cout << 0 << endl;
    
    int counter = 0;//колличество жарок
    int raw = n;//сырые котлеты
    int polupoterey = 0;//полупрожаренные котлеты
    while ( raw > k )//жарю одну сторону
    {
        raw -= k;
        polupoterey += k;
        ++counter;
    }
 
    if ( raw ){//дожариваю первую сторону и начинаю вторую
        polupoterey += raw;
        polupoterey -= ( k  - raw );
        ++counter;
 
    }
 
    while ( polupoterey > 0 )//жарю вторую сторону
    {
        polupoterey -= k;
        ++counter;
    }
    cout << counter*m << endl;
        return 0;
}
Добавлено через 12 минут
Немного поправлю, так лучше
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
#include <iostream>
using namespace std;
 
int main()
{
    int k, m, n;//я принял k - вместимость n - число котлет
    cin >> k >> m >> n;
    if (k == 0 || m == 0 || n == 0)
        cout << 0 << endl;
    
    int counter = 0;//колличество жарок
    int raw = n;//сырые котлеты
    int polupoterey = 0;//полупрожаренные котлеты
    while ( raw > k )//жарю одну сторону
    {
        raw -= k;
        ++counter;
    }
 
    int polupoterey = n;//полупрожаренные котлеты
    if ( raw ){//дожариваю первую сторону и начинаю вторую
        
        polupoterey -= ( k  - raw );
        ++counter;
    }
 
    while ( polupoterey > 0 )//жарю вторую сторону
    {
        polupoterey -= k;
        ++counter;
    }
    cout << counter*m << endl;
        return 0;
}
Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 251
10.07.2015, 18:04  [ТС] #10
Цитата Сообщение от D_Gon Посмотреть сообщение
Немного поправлю, так лучше
Совсем не понимаю вашей методики, и тем не менее она не проходит тесты, притом что я убрал множественное инициализирование переменной polupottery
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
10.07.2015, 18:07 #11
Цитата Сообщение от Melvil Посмотреть сообщение
k = 2, m = 2, n = 1
По этой формуле ответ выходит 2, а на самом деле = 4.
вырожденный случай, количество меньше чем влазит
пока можно обойтись if
C++
1
2
if(n<=k)
 return m*2;
а я еще подумаю
кстати у тебя тоже не все гладко
Цитата Сообщение от Melvil Посмотреть сообщение
if (k == 0 || m == 0 || n == 0)
если влазит 0 котлет(сковородку пропили) то время жарки не 0 а бесконечность
Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 251
10.07.2015, 18:13  [ТС] #12
Цитата Сообщение от ValeryS Посмотреть сообщение
вырожденный случай, количество меньше чем влазит
пока можно обойтись if
Вот сделал же тоже самое уже, только перепутал k и m. Спасибо.

Цитата Сообщение от ValeryS Посмотреть сообщение
если влазит 0 котлет(сковородку пропили) то время жарки не 0 а бесконечность
Я об этом ещё сначала подумал, но в условии об этом не сказано

Решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{
    double k, m, n;
    int result;
    cin >> k >> m >> n;
    if (k == 0 || m == 0 || n == 0)
    {
        cout << 0 << endl;
        exit(0);
    }
    else if (n <= k)
    {
        cout << m * 2 << endl;
        exit(0);
    }
    result = ceil((n * 2) / k);
    cout << result * m << endl;
    return 0;
}
Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
return m*2;
Никогда не понимал, что даст return m*2 ? Присвоит m = m*2 ?
rikimaru2013
C++ Game Dev
2429 / 1123 / 240
Регистрация: 30.11.2013
Сообщений: 3,673
10.07.2015, 18:14 #13
Я один зашёл сюда в надежду увидить картинку котлеты?
D_Gon
23 / 12 / 5
Регистрация: 09.07.2015
Сообщений: 47
10.07.2015, 18:24 #14
Название: 1.jpg
Просмотров: 38

Размер: 9.7 Кб
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 k, m, n;//я принял k - вместимость n - число котлет
    cin >> k >> m >> n;
    if (k == 0 || m == 0 || n == 0)
        cout << 0 << endl;
 
    int counter = 2*n/k;//колличество жарок
    if ( !n%k )
        if ( counter )
            ++counter;  
 
    cout << counter*m << endl;
 
    return 0;
}
Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 251
10.07.2015, 18:36  [ТС] #15
D_Gon,
Вообще, один из советов, которые я читал - это не пытаться оптимизировать код, т.к. он должен оставаться понятным. Ну а во-вторых, у вас опять ошибка на втором тесте, проверьте вашу программу на числах k = 2, n = 2, n = 1 или с вышеизложенным решением.

Добавлено через 5 минут
D_Gon,

Решение по вашему способу:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{
    int k;//я принял k - вместимость n - число котлет
    double m, n;
    cin >> k >> m >> n;
    if (k == 0 || m == 0 || n == 0)
        cout << 0 << endl;
    else if (n <= k)
    {
        cout << m * 2 << endl;
        exit(0);
    }
    int counter = ceil((2 * n) / k);//колличество жарок
    if (!n%k)
        if (counter)
        ++counter;
 
    cout << counter*m << endl;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2015, 18:36
Привет! Вот еще темы с ответами:

Минимальное число, которое делится нацело - C++
Необходимо решить задачу с помощью цикла! Условие: Напечатать минимальное число, большее 200, которое нацело делиться на 17 То что...

Найти минимальное количество первых букв, по которым можно различить слова из заданного набора - C++
Задан массив слов. Написать программу, указывающую минимальное количество первых букв, по которым можно разли¬чить слова из заданного...

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

Меню, которое все время на экране и которое не исчезает при скролле странички - C# ASP.NET
как делается меню, которое все время на экране и которое не исчезает при скролле странички?


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.07.2015, 18:36
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru