Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
1 / 1 / 0
Регистрация: 04.11.2017
Сообщений: 58
1

Помогите Морфеусу узнать, сможет ли Нео убить ровно N агентов ударами левой и правой ноги

29.08.2019, 22:19. Показов 2036. Ответов 24
Метки нет (Все метки)

Здравствуйте, всем задача след.:

Морфеус и Нео готовятся к очередной схватке с армией агентов. Морфеус отвечает за разработку
всей операции, а Нео проявляет свои способности избранного. А именно — Нео будет наносить удары
по агентам либо правой, либо левой ногой. Правой ногой он нейтрализует сразу 5 агентов, а левой —
всего 3. Всего на бой выйдут N агентов. Морфеус ценит свои кадры, поэтому хочет заранее знать,
сколько ударов каждой ногой нанесет Нео при условии, что каждой ногой он может сделать не более
R ударов, чтобы не устать, и не менее L ударов, потому что даже в матрице надо тренироваться.
Помогите Морфеусу узнать, сможет ли Нео убить ровно N агентов ударами левой и правой
ноги. Если план невыполним, то выведите −1. Иначе выведите количество ударов сначала правой,
потом левой ногой.
Если решений несколько, выведите то, где правая нога совершает наименьшее возможное число
ударов.

Формат входных данных
В первой строке дано единственное целое число 0 <= N <= 106 — число агентов.
Во второй строке даны два целых числа 0 <= L <= R <= 1018 — ограничения на число ударов
каждой из ног.

Формат выходных данных
Если решения нет, выведите единственное число −1 Иначе выведите два целых числа — число
ударов правой и левой ногой.


Примеры
ввод: 13 1 2
вывод: 2 1

ввод: 2 0 100
вывод: -1

ввод: 30 2 10
вывод: 3 5
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.08.2019, 22:19
Ответы с готовыми решениями:

При нажатии левой клавиши "мыши" отразить курсор в левой половине экрана, а при нажатии правой - в правой
При нажатии левой клавиши &quot;мыши&quot; отразить курсор в левой половине экрана, а при нажатии правой - в...

Анимация: человечек по желанию пользователей либо махает правой рукой, либо левой или правой ногой
написать программу, при помощи которой человечек будет по желанию пользователей либо махать правой...

Рисунки с левой и с-правой сторону
Подскажите как сделать рисунок с левой стороны и с правой? я сделал но у меня криво отображается...

ПравилА левой и правой руки
Помогите пожалуйста с правилами левой и правой руки со всеми тонкостями)) Постоянно путаю все....

24
348 / 282 / 144
Регистрация: 08.04.2013
Сообщений: 1,228
30.08.2019, 07:32 2
Цитата Сообщение от Xait Посмотреть сообщение
ввод: 30 2 10
вывод: 3 5
а где тут логика? (ошибка явная или ваша очяпятка )
0
812 / 500 / 210
Регистрация: 19.01.2019
Сообщений: 1,196
30.08.2019, 10:29 3
marat_miaki, (3 * 5) + (5 * 3) = 30, 3 и 5 принадлежат [2 - 10]. почему ошибка?
0
348 / 282 / 144
Регистрация: 08.04.2013
Сообщений: 1,228
30.08.2019, 10:48 4
все понял про интервал

Добавлено через 5 минут
все понял про интервал, но ограничение 2 удара для левой и 10 для правой, а удар левой больше ограничения
0
NeoMatrix
30.08.2019, 13:47
  #5

Не по теме:

А руки использовать можно?
Или только ногами разрешаете?
С уважением, Neo.

0
348 / 282 / 144
Регистрация: 08.04.2013
Сообщений: 1,228
31.08.2019, 13:36 6
Во наворотил
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
#include <iostream>
using namespace std;
int main()
{
    int N,L,R;
    int maxL,maxR,rezL,rezR;
    int count=0;
    bool otvet= false;
    cout << " N : "; cin >> N;
    cout << " L : "; cin >> L;
    cout << " R : "; cin >> R;
    
    maxL=N/3;
 if (L < maxL) maxL=L; 
      maxR=N/5; if (R < maxR) maxR=R;
    
    for (int i = 0; i<=maxL; ++i ) 
    {
        for (int j = 0; j<=maxR; ++j)
        {
            if (i*3+j*5 ==N) 
            {   
                count++;
                otvet = true; 
                if (count>1) 
                {
                    if (rezR > j) { rezR=j; rezL=i;}
                }
                else 
                {
                    rezR=j; rezL=i;
                }
                cout<< " cn "<<count << " R = " << rezR << " L = "<< rezL << endl; 
            }
        }
    }
    if (otvet){
        cout << "Otvet: R = " << rezR << " L = "<< rezL << endl; 
        }
    else cout << " Нет решения" ; 
    return 0;
}
0
1 / 1 / 0
Регистрация: 04.11.2017
Сообщений: 58
31.08.2019, 13:46  [ТС] 7
marat_miaki, не не только первый пример работает а остальные не

Добавлено через 1 минуту
ну в общем гляньте у меня оно рабочая но после 4 теста из 100, оно дает ошибки первые 3 теста я уже написал а остальные не знаю
C++ (Qt)
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
using namespace std;
int main()
{
  long long N, L, R, M, x=0, y=0;
  cin >> N >> L >> R;M=N;
  if(N<=3*L+5*R){
    do{
      N-=3;x++;
      M-=5;y++;
    }
    while(N%5!=0 && M%3!=0 && N>0 && M>0);
   if(N>=0 and N%5==0){
     y=N/5;
     cout << y << " " << x << endl;
   }
   else{
     if(M>=0 and M%3==0){
       x=M/3;
       cout << y << " " << x << endl;
     }
     else{
       cout << -1 << endl;
     }
   }
 }
  else{
    cout << -1 << endl;
  }
 return 0;
}
0
348 / 282 / 144
Регистрация: 08.04.2013
Сообщений: 1,228
31.08.2019, 13:47 8
вы не правы ожидая от третьего результат, там прокатит только при 30 5 10 я об этом говорил выше
ну и уберите все лишнее, и напишите -1 куда нодо
0
1 / 1 / 0
Регистрация: 04.11.2017
Сообщений: 58
31.08.2019, 13:55  [ТС] 9
marat_miaki, ну окей, будем считать что 3 пример это -1

но и в вашем коде 2 пример некорректно не работает
0
348 / 282 / 144
Регистрация: 08.04.2013
Сообщений: 1,228
31.08.2019, 14:14 10
30 2 10 это 6 0 - 30 5 10 это 3 5
Выводится количество ударов сначала правой,потом левой ногой -- это условие задачи

Добавлено через 11 минут
все понял свою ошибку, в условии прописано не менее L ударов, я учел как не более L ударов

Добавлено через 4 минуты
Кликните здесь для просмотра всего текста
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
#include <iostream>
 
using namespace std;
 
int main()
{
    int N,L,R;
    int maxL,maxR,rezL,rezR;
    int count=0;
    bool otvet= false;
    cout << " N : "; cin >> N;
    cout << " L : "; cin >> L;
    cout << " R : "; cin >> R;
    
    maxR=N/5; if (R < maxR) maxR=R;
    
    for (int i = L; i<=maxR; ++i ) 
    {
        for (int j = 0; j<=maxR; ++j)
        {
            if (i*3+j*5 ==N) 
            {   
                count++;
                otvet = true; 
                if (count>1) 
                {
                    if (rezR > j) { rezR=j; rezL=i;}
                }
                else 
                {
                    rezR=j; rezL=i;
                }
            //  cout<< " cn "<<count << " R = " << rezR << " L = "<< rezL << endl; 
            }
        }
    }
    if (otvet){
        cout <<  rezR << ' ' <<  rezL << endl; 
        }
    else cout << "-1" ; 
    return 0;
}
1
1 / 1 / 0
Регистрация: 04.11.2017
Сообщений: 58
31.08.2019, 17:06  [ТС] 11
marat_miaki, Ой, как это задача меня уже раздражает, попробовал еще разные способы решение задач но ни каких успехов, говорит что 7 тест как то неправильно работает
0
Миниатюры
Помогите Морфеусу узнать, сможет ли Нео убить ровно N агентов ударами левой и правой ноги  
812 / 500 / 210
Регистрация: 19.01.2019
Сообщений: 1,196
31.08.2019, 17:14 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
35
36
37
38
39
40
41
42
#include <iostream>
#include <algorithm>
 
int main()
{
    uint64_t n, l, r;
    std::cin >> n >> l >> r;
 
    if (n < l * 3 + l * 5) {
        std::cout << -1;
        return 0;
    }
    n -= l * 3 + l * 5;
    int64_t ulk = std::min(n / 3, r - l);
    uint64_t urk = std::min((n - 3 * ulk) / 5, r - l);
    switch (n - ulk * 3 + urk * 5)
    {
    case 1:
        ulk -= 3, urk += 2;
        break;
    case 2:
        ulk -= 1, urk += 1;
        break;
    case 3:
        ulk -= 4, urk += 3;
        break;
    case 4:
        ulk -= 2, urk += 2;
        break;
    default:
        break;
    }
 
    if (ulk >= 0 && urk <= r - l && ulk * 3 + urk * 5 == n) {
        std::cout << urk + l << ' ' << ulk + l;
    }
    else {
        std::cout << -1;
    }
 
    return 0;
}
1
1 / 1 / 0
Регистрация: 04.11.2017
Сообщений: 58
31.08.2019, 17:26  [ТС] 13
nalbe666, немножечко, продвигались теперь в 8 место ошибко
0
Миниатюры
Помогите Морфеусу узнать, сможет ли Нео убить ровно N агентов ударами левой и правой ноги  
812 / 500 / 210
Регистрация: 19.01.2019
Сообщений: 1,196
31.08.2019, 17:51 14
Тогда так.
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
#include <iostream>
#include <algorithm>
 
int main()
{
    uint64_t n, l, r;
    std::cin >> n >> l >> r;
 
    if (l > n / 3 || r > n / 3 || n < l * 3 + l * 5) {
        std::cout << -1;
        return 0;
    }
    n -= l * 3 + l * 5;
    int64_t ulk = std::min(n / 3, r - l);
    uint64_t urk = std::min((n - 3 * ulk) / 5, r - l);
    switch (n - ulk * 3 + urk * 5)
    {
    case 1:
        ulk -= 3, urk += 2;
        break;
    case 2:
        ulk -= 1, urk += 1;
        break;
    case 3:
        ulk -= 4, urk += 3;
        break;
    case 4:
        ulk -= 2, urk += 2;
        break;
    default:
        break;
    }
 
    if (ulk >= 0 && urk <= r - l && ulk * 3 + urk * 5 == n) {
        std::cout << urk + l << ' ' << ulk + l;
    }
    else {
        std::cout << -1;
    }
 
    return 0;
}
0
1 / 1 / 0
Регистрация: 04.11.2017
Сообщений: 58
31.08.2019, 17:59  [ТС] 15
nalbe666, на этом варианте не 8 а теперь 7 ошибку выдает
0
348 / 282 / 144
Регистрация: 08.04.2013
Сообщений: 1,228
31.08.2019, 17:59 16
И что там в 7 и 8 входных данных?
0
812 / 500 / 210
Регистрация: 19.01.2019
Сообщений: 1,196
31.08.2019, 18:06 17
Где-то тупая ошибка.
Xait,
Цитата Сообщение от nalbe666 Посмотреть сообщение
if (l > n / 3 || r > n / 3 || n < l * 3 + l * 5) {
*
Попробуйте замените на
C++
1
if (l > n / 3 || n < l * 3 + l * 5) {
0
348 / 282 / 144
Регистрация: 08.04.2013
Сообщений: 1,228
31.08.2019, 18:30 18
в моем коде стоит попробовать maxR=N/5; заменить на maxR=N/3;
или
C++
1
2
3
4
5
    maxR=N/3; if (R < maxR) maxR=R;
    
    for (int i = L; i<=maxR; ++i ) 
    {
        for (int j = 0; j<=maxR; ++j)
прописать как без моих заморочек
C++
1
2
3
4
5
  //  maxR=N/5; if (R < maxR) maxR=R;
    
    for (int i = L; i<=R; ++i ) 
    {
        for (int j = 0; j<=R; ++j)
Добавлено через 8 минут
if (rezR > j) { rezR=j; rezL=i;} тоже подправить на if (rezR > j&& rezL>i) { rezR=j; rezL=i;}
0
1 / 1 / 0
Регистрация: 04.11.2017
Сообщений: 58
31.08.2019, 19:06  [ТС] 19
marat_miaki, это я тоже не Знаю, если бы знал решил бы задачу давно, помнял

nalbe666, заменил не помогло

у обоих не работает до 7 задачи
0
812 / 500 / 210
Регистрация: 19.01.2019
Сообщений: 1,196
31.08.2019, 19:40 20
Барабанная дробь..

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
#include <iostream>
#include <algorithm>
 
int main()
{
    uint64_t n, l, r;
    std::cin >> n >> l >> r;
 
    if (n / 8 < l) {
        std::cout << -1;
        return 0;
    }
    n -= l * 8;
    int64_t ulk = std::min(n / 3, r - l);
    uint64_t urk = std::min((n - ulk * 3) / 5, r - l);
    switch (n - ulk * 3 + urk * 5)
    {
    case 1:
        ulk -= 3, urk += 2;
        break;
    case 2:
        ulk -= 1, urk += 1;
        break;
    case 3:
        ulk -= 4, urk += 3;
        break;
    case 4:
        ulk -= 2, urk += 2;
        break;
    default:
        break;
    }
 
    if (ulk >= 0 && urk <= r - l && ulk * 3 + urk * 5 == n) {
        std::cout << l + urk << ' ' << l + ulk;
    }
    else {
        std::cout << -1;
    }
 
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.08.2019, 19:40

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Отличие правой и левой свертки
Правую и левую свертку можно реализовать так: #!/usr/bin/racket #lang scheme (define...

Код левой и правой кнопки мышки
Нужны коды кнопок мышки, в Keys не нашёл. Я использую следующий код для захвата кнопок: protected...

Ввод текста в TEdit с правой стороны, а не с левой
Можнали сделать чтобы текст в редакторе Edit вводился не с левой части а с правой.

Работа с PopupMenu левой и правой кнопками мыши
В моем проекте требуется задать возможность менять пользователем названия осей координат (показаны...

Однозначная грамматика без правой и левой рекурсии
Всем привет! Сижу, зубрю системное программирование и наткнулся на такой вопрос: верно ли...

Горизонтальное выравнивание левой и правой колонок на сайте
Люди, помогите пожалуйста снова новичку :). Я продолжаю свле обучение и опять застрял : не понимаю...


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

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

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