1 Востаннє редагувалося Joker (08.09.2014 16:14:13)

Тема: Олімпіадна задачка

Дивіться є ось така задачка - http://www.e-olimp.com/ua/problems/2391

мій код
// Вартість розмови
#include <iostream>
using namespace std;
typedef unsigned long int uli;

int main()
{
    uli A, B, N;
    uli time = 0;
    uli rez = 0;

    cin >> A >> B >> N;

    time = N / 60;

    rez = A + (time * B);

    if ((N % 2) != 0)
        rez += B;

    cout << rez << endl;

    system("pause");
    return 0;
}

Якщо замінити uli на int - нічого не зміниться.
Проблема у тому, що чомусь не проходить 1 тест. Перевірку на неповні хвилини я начебто зробив.
Хтось знає у чому підвох, чи то я що не правильно роблю?

2

Re: Олімпіадна задачка

Контрприклад: 2 секунди, 1 коп. за підключення, 100 коп. за хвилину. Яка має бути вартість теоретична, а яку дає ваша програма? Чому, як гадаєте?

3

Re: Олімпіадна задачка

koala написав:

2 секунди, 1 коп. за підключення, 100 коп. за хвилину.

?

4 Востаннє редагувалося Chemist-i (02.09.2014 23:57:23)

Re: Олімпіадна задачка

koala написав:

Контрприклад: 2 секунди, 1 коп. за підключення, 100 коп. за хвилину. Яка має бути вартість теоретична, а яку дає ваша програма? Чому, як гадаєте?

Joker, не відкривайте

бо N / 60 = 0; при N < 60?

Подякували: koala, Joker2

5 Востаннє редагувалося Joker (03.09.2014 17:01:17)

Re: Олімпіадна задачка

зроблю кучу дз, тоді напишу новий код.
Ну я і телепень, така дурна причина  *FACEPALM*

Ну що робити я начебто зрозумів, дякую!!!

6 Востаннє редагувалося Joker (03.09.2014 17:27:17)

Re: Олімпіадна задачка

Вирішив поміняти місцями уроки і програмування.
Довго не думав і тепер додав ось такий фрагмент

// Вартість розмови
#include <iostream>
using namespace std;

int main()
{
    int A, B, N;
    int time = 0;
    int rez = 0;

    cin >> A >> B >> N;

    if (N < 60) {
        rez = A + B;
    }
    else {
        time = N / 60;
        rez = A + (time * B);

        if ((N % 2) != 0)
            rez += B;
    }



    cout << rez << endl;

    system("pause");
    return 0;
}

Хоча мені не подобається такий стиль, коли if у середині if.

На компі здається все проходить (коли N<60)
Але знову ж 2 тест - неправильна відповідь.

Контрприклад: 2 секунди, 1 коп. за підключення, 100 коп. за хвилину.

Тепер відповідь 101.

7 Востаннє редагувалося Arete (03.09.2014 17:57:29)

Re: Олімпіадна задачка

Joker написав:
        if ((N % 2) != 0)

В цьому рядку ти мабуть хотів написати:

        if ((N % 60) != 0)

З.І. Сумбурний алгоритм в тебе вийшов :)
1. Вирахуй кількість хвилин, за які потрібно заплатити
2. Помнож цю кількість на вартість хвилини
3. Добав вартість з’єднання

8

Re: Олімпіадна задачка

 if ((N % 60) != 0)
 if ((N % 2) != 0)

На мою думку, в даному випадку результати аналогічні.

Щодо алгоритму я вже і сам поняв, що сумнівний. Головне що б працював.
А сумбурність від того, що я лінивий трошка подумати. І тому зробив все як найпростіше.

9

Re: Олімпіадна задачка

Ні разу не аналогічні, превірте на любому парному числі не кратному 60.

10

Re: Олімпіадна задачка

Все одно не працює  2 тест
Я замінив на ваш варіант

11

Re: Олімпіадна задачка

Другий тест це який? Дайте посилання, або вхідні дані.

12

Re: Олімпіадна задачка

http://www.e-olimp.com/ua/problems/2391
Я думав, що буде зрозуміло про те що відповіді тут не дають.
є 10 тестів для перевірки програми і от при відправленні результату  Відповідь до тесту 2 -
Неправильна відповідь

13

Re: Олімпіадна задачка

Ось вам тести, перевірте:
(1,2,2) -> 3
(1,2,60) -> 3
(1,2,61) -> 5

14 Востаннє редагувалося Arete (03.09.2014 21:45:29)

Re: Олімпіадна задачка

koala написав:

Ось вам тести, перевірте:
(1,2,2) -> 3
(1,2,60) -> 3
(1,2,61) -> 5

Дякую. Друга версія коду Joker-а разом з моїм зауваженням нормально працює. Хоч код і кострубатий, але помилки я там не бачу. Я не розумію який міфічний другий тест оця фіговина не може пройти.


Joker написав:

Я думав, що буде зрозуміло про те що відповіді тут не дають.
є 10 тестів для перевірки програми і от при відправленні результату

Відповіді і не потрібні. Не зрозуміло що це за тест, що він перевіряє, які вхідні параметри там?


мій варіант
void ShowPrice () {
  int priceConnect = 0;
  int priceMinute = 0;
  int seconds = 0;

  std::cin >> priceConnect >> priceMinute >> seconds;
  std::cout << ( ( seconds / 60 ) + ( ( seconds % 60 ) == 0 ? 0 : 1 ) ) * priceMinute + priceConnect << std::endl;
}

15 Востаннє редагувалося Joker (03.09.2014 21:50:20)

Re: Олімпіадна задачка

які вхідні параметри там?

Від мене потрібно лише код який задовільняє і розв'язує задачу.
Задача у лінку вище.

Усе інше робиться автоматично, все що мені відомо про задачу у силці вище. більше нічого!!!

силка на скрін еркану - https://cloud.сайт-злодій/public/b1f4e … %D0%B0.png

Ось вам тести, перевірте:
(1,2,2) -> 3
(1,2,60) -> 3
(1,2,61) -> 5

Всі працюють.

16

Re: Олімпіадна задачка

[img]https://cloclo19.домен агресора/weblink/view/b1f4ec7ba11b/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%BA%D0%B0.png?x-email=havdyak_misha1998%40mail.ru[/img]

17

Re: Олімпіадна задачка

Дякую. Скоріше за все помилка в тому що при 0 секунд все одно рахується плата за з’єднання.
Оскільки в умовах задачі мінімальна одиниця часу вказана в секундах, розмови з часом t при 0 с. < t < 1 с.  бути не може, і з’єднання відповідно теж.

18 Востаннє редагувалося koala (03.09.2014 21:59:48)

Re: Олімпіадна задачка

Гм... можливо, вони мали на увазі, що якщо 0 секунд, то зв'язок не був встановлений і не треба платити взагалі нічого?

Ну і
( ( seconds + 59 ) / 60 ) * priceMinute + priceConnect

чи, точніше, з урахуванням сказаного

( ( seconds + 59 ) / 60 ) * priceMinute + ( ( seconds > 0 )? priceConnect : 0 )
Подякували: Arete, Joker2

19

Re: Олімпіадна задачка

Спробую, щоб при 0 сек плата була тоже 0.

20

Re: Олімпіадна задачка

Ви праві, зараховано 100%
Дякую.

Хто хоче продовжувати далі думати над задачами? (є різні рівні)
Комусь цікаво?