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

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

Восстановить пароль Регистрация
 
 
Melvil
 Аватар для Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 246
10.07.2015, 16:36     Найти минимальное время, за которое можно поджарить все котлеты #1
Добрый день, хочу представить вашему вниманию небольшую задачку:

Кликните здесь для просмотра всего текста
На сковородке одновременно можно положить 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++
Алгоритм(Найти максимальное совершенное число, которое в то же время меньше введенного N) C++
Минимальное количество байт, которое займёт отрицательное число C++
C++ Требуется по начальному расположению деталей на первом конвейере определить время, через которое все детали будут изготовлены
C++ Напечатать минимальное число, большее 200, которое нацело делится на 17
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
D_Gon
 Аватар для D_Gon
22 / 11 / 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
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,039
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
 Аватар для Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 246
10.07.2015, 17:19  [ТС]     Найти минимальное время, за которое можно поджарить все котлеты #4
Цитата Сообщение от ValeryS Посмотреть сообщение
округляем к ближайшему большему 3
Не очень понял почему к ближайшему большему, но вот со сторонами всё понятно, спасибо.

Добавлено через 13 минут
Цитата Сообщение от D_Gon Посмотреть сообщение
я бы держал 3 переменных с количеством нежареных полупрожареных и жареных котлет
Интересно было бы увидеть ваш вариант решения.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,039
10.07.2015, 17:22     Найти минимальное время, за которое можно поджарить все котлеты #5
Цитата Сообщение от Melvil Посмотреть сообщение
Не очень понял почему к ближайшему большему,
потому что дискретность 1(сторона) ты не можешь поджарить 0.02 стороны
Цитата Сообщение от Melvil Посмотреть сообщение
но вот со сторонами всё понятно,
давай сторонами
кладем 99 котлет 100 минут
98 переворачиваем одну вынимаем, кладем сырую 100 минут
вынимаем 98 готовых, дожариваем оставшиеся 2 100 минут
теперь понятно откуда взялось 0.02 и почему его нужно округлить до 1 ?
Melvil
 Аватар для Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 246
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
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,039
10.07.2015, 17:31     Найти минимальное время, за которое можно поджарить все котлеты #7
Цитата Сообщение от Melvil Посмотреть сообщение
Только вот задача теперь вместо 3-го теста выдает ошибку на втором:
тест приведи, проверим
Melvil
 Аватар для Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 246
10.07.2015, 17:34  [ТС]     Найти минимальное время, за которое можно поджарить все котлеты #8
Цитата Сообщение от ValeryS Посмотреть сообщение
тест приведи, проверим
Не знаю как просматривать тесты, но одну нашёл:
k = 2, m = 2, n = 1
По этой формуле ответ выходит 2, а на самом деле = 4.
D_Gon
 Аватар для D_Gon
22 / 11 / 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
 Аватар для Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 246
10.07.2015, 18:04  [ТС]     Найти минимальное время, за которое можно поджарить все котлеты #10
Цитата Сообщение от D_Gon Посмотреть сообщение
Немного поправлю, так лучше
Совсем не понимаю вашей методики, и тем не менее она не проходит тесты, притом что я убрал множественное инициализирование переменной polupottery
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,039
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
 Аватар для Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 246
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
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,224
10.07.2015, 18:14     Найти минимальное время, за которое можно поджарить все котлеты #13
Я один зашёл сюда в надежду увидить картинку котлеты?
D_Gon
 Аватар для D_Gon
22 / 11 / 5
Регистрация: 09.07.2015
Сообщений: 47
10.07.2015, 18:24     Найти минимальное время, за которое можно поджарить все котлеты #14
Название: 1.jpg
Просмотров: 36

Размер: 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
 Аватар для Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 246
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;
}
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,039
10.07.2015, 18:45     Найти минимальное время, за которое можно поджарить все котлеты #16
Цитата Сообщение от Melvil Посмотреть сообщение
проверьте вашу программу на числах k = 2, n = 2, n = 1
Я уже посмотрел
Цитата Сообщение от D_Gon Посмотреть сообщение
C++
1
2
3
4
int counter = 2*n/k;//колличество жарок
    if ( !n%k )
        if ( counter )
            ++counter;
int counter = 2*n/k;//колличество жарок
2*1/2=1
if ( !n%k )
вот здесь ошибка,если есть остаток тогда добавим одну жарку т.е if ( n%k ) или if ( n%k!=0 )
1%2 =1
if ( counter ) непонятно зачем
++counter; 1+1=2
итого две жарки по две минуты, итого 4

Добавлено через 4 минуты
но вот что будет если вмещает три котлеты а жарить одну?
int counter = 2*n/k;//количество жарок
2*1/3=0
if ( !n%k )
вот здесь ошибка,если есть остаток тогда добавим одну жарку т.е if ( n%k ) или if ( n%k!=0 )
1%3 =1
if ( counter ) 0 т.е ложь не входим

вообще не жарим, сырую съедим
правильно нехрен ради одной котлеты сковородку портить

Добавлено через 1 минуту
Цитата Сообщение от Melvil Посмотреть сообщение
if (!n%k)
и что проканало?
% не определен для double
Melvil
 Аватар для Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 246
10.07.2015, 18:54  [ТС]     Найти минимальное время, за которое можно поджарить все котлеты #17
Цитата Сообщение от ValeryS Посмотреть сообщение
и что проканало?
% не определен для double
Я так понял это обозначает:

C++
1
if (n%k == 0 )
А вообще фишка в том, что код ниже по факту - мусор и он не будет использоваться. Если посмотреть на моё первоначальное решение, то оно такое же, только без данного кода.

Цитата Сообщение от D_Gon Посмотреть сообщение
if ( !n%k )
* * * * if ( counter )
* * * * * * ++counter;
D_Gon
 Аватар для D_Gon
22 / 11 / 5
Регистрация: 09.07.2015
Сообщений: 47
10.07.2015, 18:59     Найти минимальное время, за которое можно поджарить все котлеты #18
Прошу прощения за предыдущий пост, вроде так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
 
int main(){
 
    int capacity, time, raw;
 
    cin >> capacity >> time >> raw;
 
    int counter = 2*( raw/capacity );
    
    if( counter != 0 && ( raw%capacity )*2 <= capacity )
        ++counter;
    else
        counter +=2;
 
    cout << counter*time << endl;
 
    return 0;
}
Melvil
 Аватар для Melvil
47 / 46 / 13
Регистрация: 20.05.2015
Сообщений: 246
10.07.2015, 19:00  [ТС]     Найти минимальное время, за которое можно поджарить все котлеты #19
Кто меньше?:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cmath>
 
main()
{
    int k,c;
    double m, n;
    std::cin >> k >> m >> n;
    if (n <= k)
    {
        std::cout << m * 2;
        exit(0);
    }
    c = ceil((2 * n) / k);
    std::cout << c*m;
}
D_Gon,
Ошибка, только уже на первом тесте.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2015, 19:01     Найти минимальное время, за которое можно поджарить все котлеты
Еще ссылки по теме:

C++ Найти минимальное количество купюр, которое необходимо использовать, чтобы выдать сумму в n гривен
C++ Графы, найти минимальное время, необходимое для выполнения всех задач
Найти минимальное количество шариков, которое необходимо перекрасить, чтобы все шарики были одного цвета C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,039
10.07.2015, 19:01     Найти минимальное время, за которое можно поджарить все котлеты #20
Цитата Сообщение от Melvil Посмотреть сообщение
Я так понял это обозначает:
% это остаток от деления, определен для целочисленных
например
3/2 равно 1 и остаток 1
3%2 =1
если числа кратные то остаток 0
4/2=2
4%2=0
Yandex
Объявления
10.07.2015, 19:01     Найти минимальное время, за которое можно поджарить все котлеты
Ответ Создать тему
Опции темы

Текущее время: 17:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru