За последние 24 часа нас посетил 17661 программист и 1721 робот. Сейчас ищут 1850 программистов ...

Помогите начинающему программисту решить задачу

Тема в разделе "PHP для новичков", создана пользователем Slavon143, 27 авг 2016.

  1. Slavon143

    Slavon143 Новичок

    С нами с:
    27 авг 2016
    Сообщения:
    43
    Симпатии:
    0
    Задача переведена с английского.
    2. Секретарь Jeniffer
    Дженифер, наш секретарь, пошел в офис сегодня поздно, и срочно нужно, чтобы сэкономить время, чтобы иметь ужин, но она нуждается в N копий одного и того же документа. Есть два Xerox, один из которых копирует список бумаги для х секунд, а другой - на у секунд. (Вы можете использовать одну машину Xerox, или оба одновременно. Вы можете не только копировать с оригинала, но и использовать копию.) Для того, чтобы помочь ей выяснить, что это минимальное время, которое потребуется.
    Входные данные
    Функция должна принимать три целых числа: N, х и у
    Выходные данные
    Функция должна возвращать одно целое число - минимальное время в секундах, необходимое для получения N копий.
    Пример1:
    N = 4
    х = 1
    у = 1
    Результат: 3
    Example2:
    N = 5
    х = 1
    у = 2
    Результат: 4
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ух. Ну эту задачу надо сначала математически решить, может кому интересно станет.
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    тут главное не забыть, что оригинал один.
     
    askanim нравится это.
  4. Slavon143

    Slavon143 Новичок

    С нами с:
    27 авг 2016
    Сообщения:
    43
    Симпатии:
    0
    Может на английском кому то понятнее будет. Я уже голову сломал.
    2. Secretary Jeniffer
    Jenifer, our secretary, went to the office late today, and it is urgently necessary to save time to have a dinner, but she needs N copies of the same document. There are two Xerox, one of which copies the list of paper for x seconds, and the other one - for y seconds. (You may use one Xerox machine, or both at the same time. You can not only copy from the original, but also use a copy.) To help her to find out what is the minimum time it will take.
    Input data
    Function should receive three integers: N, x and y
    Output data
    Function should return a single number - the minimum time in seconds required for the preparation of N copies.
    Example1:
    N = 4
    x = 1
    y = 1
    Result: 3
    Example2:
    N = 5
    x = 1
    y = 2
    Result: 4
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не, чувак. Задача понятна. Просто ты должен сам её решить или забить и смириться с поражением.
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну ты по-русски объясни, как ты будешь копировать, потом посмотри, сколько это времени займёт, потом переведи в блоксхему, потом уже на PHP-е. Задача к PHP малое отношение имеет, на самом деле.
     
  7. dcc0

    dcc0 Активный пользователь

    С нами с:
    27 июн 2014
    Сообщения:
    214
    Симпатии:
    4
    You may use one Xerox machine, or both at the same time
    Бедняжка Дженифер должна распараллелировать процесс, одна рука на один ксерокс? Или как?

    You can not only copy from the original, but also use a copy
    И что даёт эта фраза к задаче? Потерю время на перекладывание оригинала и копии?

    Но не понимаю в чём сложность задачи?
    По-моему всё как воздух горы Тянь-Шань прозрачно.
     
  8. Anhk

    Anhk Активный пользователь

    С нами с:
    13 дек 2015
    Сообщения:
    219
    Симпатии:
    11
    не понял про "лист бумаги за Х секунд" :/
    ну так чем меньшее количество времени будет затрачиваться на лист бумаги, тем быстрее она отксерит нужное количество.
    по-моему, я что-то не так понял...
    --- Добавлено ---
    з.ы. автор, русский перевод ужасен, имеет смысл оставить только оригинал. имхо
    --- Добавлено ---
    тут тоже не догнал.
    стартуем: 1 оригинал и 0 копий
    1 секунда: имеем 2 копии
    2 секунда: имеем 4 копии
    или соль в том, что работа происходит не параллельно?
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
     
  10. dcc0

    dcc0 Активный пользователь

    С нами с:
    27 июн 2014
    Сообщения:
    214
    Симпатии:
    4
    @igordata, ок!
    N = 5
    x = 1
    y = 2
    Result: 4
    Она сканирует 1 копию на x - 1 сек
    Потом + 2 на x и 1 на y за 2 сек
    И тут вопрос: поскольку y работает медленнее, должна ли она успеть отсканировать на x еще одну копию?
    Если да, то за 3 секунды будет отсканировано 4 копиии
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Тадаааа! :D
     
  12. Anhk

    Anhk Активный пользователь

    С нами с:
    13 дек 2015
    Сообщения:
    219
    Симпатии:
    11
    на свежую голову изовщина) не обратил внимание на оригинал
     
  13. vikrorpert

    vikrorpert Активный пользователь

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    если делать через цикл то довольно просто
    интересно можно без цикла?
     
  14. vikrorpert

    vikrorpert Активный пользователь

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    сам и отвечу
    Код (Text):
    1. (n-1)*(x+y)/4
    результат округляем к большему целому, и прибавляем минимальное между х или у
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Если
    N = 2
    x = 1
    y = 2
    то задействовать второй нет смысла. То же при любых экстремальных числах (y = 65535).
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    мне кажется, что имеет смысл выразить более медленный через более быстрый. И должна получиться тупо формула линейного уравнения с округлением вверх.
     
  18. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Q = 1/x + 1/y = суммарная производительность
    t = N/Q
    округлять следует в большую сторону
    Код (Text):
    1. $t = ceil($N / (1 / $x + 1 / $y));
     
    mkramer нравится это.
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    плюс первая копия.
     
  20. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @igordata +
    Код (Text):
    1. $t = ceil(($N - 1) / (1 / $x + 1 / $y) + min([$x, $y]));
     
    mkramer нравится это.
  21. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Проверьте, вроде вот оно... И должно пахать :D

    PHP:
    1. function express_xerox_copy($N, $y, $x) {
    2.         if ($x<$y) {
    3.             $Nx_All_time = $N * $x;
    4.             $t = $y;
    5.             $_t = $x;
    6.         }
    7.         else if ($y<$x) {
    8.             $Nx_All_time = $N * $y;
    9.             $t = $x;
    10.             $_t = $y;
    11.         }
    12.         elseif ($y==$x) {
    13.             if($N%2 == 0) {
    14.                 $all_res_time = $N/2 * $x;
    15.                 return $all_res_time;
    16.             }
    17.             else {
    18.                 $all_res_time = floor($N/2) * $x;
    19.                 $all_res_time += $x;
    20.                 return $all_res_time;
    21.             }
    22.         }
    23.         $all_res_time = 0;
    24.         $time2 = $t;
    25.         for ($i=0; $i<$N; $i=0) {
    26.             $N = $N-1;
    27.             $all_res_time += $_t;
    28.             if($time2 <= $Nx_All_time) {
    29.                 $N = $N-1;
    30.                 $time2 += $t;
    31.                 $Nx_All_time = $N*$_t;
    32.             }
    33.  
    34.         }
    35.         return $all_res_time;
    36.     }
    --- Добавлено ---
    Всё вот алгоритм сто пудов работающий :D
    --- Добавлено ---
    PHP:
    1. echo express_xerox_copy(50, 10, 5);
    2. // при вводе таких данных я получил результат: 185
    --- Добавлено ---
    PHP:
    1. // При вводе таких данных:
    2. echo express_xerox_copy(10, 6, 3);
    3. // Получил результат 21 :) Всё верно товарищи)))
    4. // я написал скрипт который может расчитать работу принтеров :)))
     
    #21 askanim, 29 авг 2016
    Последнее редактирование: 29 авг 2016
  22. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    askanim, у тебя неправильно считает даже для простейшего случая (4,1,1)
    что говорить про более сложные)
     
  23. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @runcore да ну докажи
    --- Добавлено ---
    @runcore вот у меня показывает 2 секунды скрипт
    --- Добавлено ---
    @runcore значит считает правильно!
     
  24. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @askanim, а должен 3, по условию задачи, для этих данных.
     
  25. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    а что тут доказывать. распиши словами алгоритм для этого простого случая. сразу увидишь что 2 секунды это неправильно)