Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/35: Рейтинг темы: голосов - 35, средняя оценка - 4.60
2 / 2 / 0
Регистрация: 03.05.2020
Сообщений: 202

Пещера с монстрами

27.07.2021, 04:48. Показов 7869. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пещера с монстрами
Юный программист Коля играет в компьютерную игру. Чтобы пройти очередной уровень в этой игре, ему нужно зайти в пещеру с n монстрами и убить их одного за другим. Монстры имеют здоровье h1,…,hn. Если герой Коли имеет силу X, то каждый удар героя по монстру будет уменьшать здоровье монстра на X. Монстр погибает, когда его здоровье становится меньше или равно нулю. Герой Коли имеет ограниченную выносливость, поэтому он сможет нанести не более чем m ударов. Таким образом, чтобы пройти уровень, необходимо победить всех монстров не более чем за m ударов.

В данный момент герой Коли имеет силу удара равную 0. Игрок может повысить силу удара своего героя до натурального числа X, но для этого ему придётся потратить X игровых очков. Коля не хочет тратить лишних очков, поэтому решил найти такое минимальное натуральное число X, которого будет достаточно для успешного прохождения пещеры с монстрами. Помогите Коле найти это число или выведите −1, если такого X не существует.

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

В первой строке входных данных задано натуральное число n (1≤n≤105) — количество монстров. Во второй строке заданы через пробел n целых чисел — здоровье монстров 1≤hi≤109. В третьей строке задано натуральное число m (1≤m≤109) — выносливость героя.

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

Выведите ответ на задачу.

Примеры
Ввод
10
5 20 7 4 18 19 19 3 10 2
25
Вывод
5
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.07.2021, 04:48
Ответы с готовыми решениями:

Пещера с монстрами
Пещера с монстрами Юный программист Коля играет в компьютерную игру. Чтобы пройти очередной уровень в этой игре, ему нужно зайти в пещеру...

Пещера с монстрами
Пещера с монстрами Юный программист Коля играет в компьютерную игру. Чтобы пройти очередной уровень в этой игре, ему нужно зайти в пещеру...

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

41
 Аватар для irthgr
24 / 21 / 2
Регистрация: 15.05.2021
Сообщений: 57
30.07.2021, 12:48
Студворк — интернет-сервис помощи студентам
во всём просторе интернета, решений на с++ по этой задаче нет, я начал искать готовое решение сегодня, так как времени нет на решение самому там ещё 5 задач!
а так вот (это не полное решение и не всё моё, я поменял немного):
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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 22e4;
 
int a[N], t[N];
int cal(int n) {
    int ans = 1;
    for (int i = 0, l = -1, mx = 0; i < n; i++) {
        mx = max(mx, a[i]);
        if (t[i - l] < mx)l = i - 1, ans++, mx = a[i];
        if (t[1] < a[i])return -1;
    }
    return ans;
}
int main() {
    ios::sync_with_stdio(0);
    int T=1, n, m;
    
    while (T--) {
        cin >> n;
        for (int i = 0; i < n; i++) {
            cin >> a[i];
            t[i + 1] = 0;
        }
        cin >> m;
        for (int i = 0, x, y; i < m; i++) {
            cin >> x >> y;
            t[y] = max(t[y], x);
        }
        for (int i = n - 1; i > 0; i--) {
            t[i] = max(t[i], t[i + 1]);
        }
        cout << cal(n) << '\n';
    }
    return 0;
}
выдаёт неверный ответ

вариант 2:
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
#include <iostream>
#include <cmath>
using namespace std;
long maxim(long a[], long n){
    long max=0;
    for (long y=0; y<n; y++){
        if (a[y]>max){max=a[y];}
    }
    return max;
}
int main()
{
    long n, m;
    cin>>n;
    long h[n];
    for (long y=0; y<n; y++){
        cin>>h[y];
    }
    cin>>m;
    if (m<n){cout<<-1;}
    else{
        long l=0;
        long r=maxim(h, n);
        //cout<<r<<endl;
       // if (m==n){cout<<r;}
 
        while (r-l>1){
            long d=(r+l)/2;
            long b=0;
            for (long y=0; y<n; y++){
                    b+=h[y]/d;
                    if (h[y]%d!=0){b++;}
            }
            if (b>=m){l=d;}
            else {r=d;}
        }
        cout<<r;
 
    }
    return 0;
}
тоже неверный ответ

Добавлено через 15 минут
и я пологаю, что ваше решение тоже не проходит?
который под вариантом 2
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
30.07.2021, 12:54
irthgr, я не в курсе, что там за сириус, но ты всё же обдумай - ведь программирование это явно не твоё
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,538
Записей в блоге: 1
30.07.2021, 13:52
lasash, чё за Сириус? Чё за драма?
0
 Аватар для irthgr
24 / 21 / 2
Регистрация: 15.05.2021
Сообщений: 57
30.07.2021, 16:30
Цитата Сообщение от Алексей1153 Посмотреть сообщение
я не в курсе, что там за сириус
сириус это образовательный центр, куда люди с 6 по 10 класс могут писать олемпиады, отборочные туры и проходить после чего отправляються в сочи, там делают много чего (учаться, развлекаются) а главное ты ничего не платишь!
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
30.07.2021, 16:45
irthgr, всё с вами, бездельниками, понятно )
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
30.07.2021, 16:47
Я бы сделал иначе. Кто сам сделал - тех в Сочи, кто списал - на Кубу.
1
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
30.07.2021, 16:49
Цитата Сообщение от Croessmah Посмотреть сообщение
на Кубу
вот ещё. Дворы мести!
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
30.07.2021, 16:51
Цитата Сообщение от Алексей1153 Посмотреть сообщение
вот ещё. Дворы мести!
На Кубе тоже надо дворы мести.
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
30.07.2021, 17:02
Croessmah, нам нужнее
1
 Аватар для irthgr
24 / 21 / 2
Регистрация: 15.05.2021
Сообщений: 57
30.07.2021, 17:35
кто из всех присутствующих идёт на сириус?
0
2 / 2 / 0
Регистрация: 06.04.2021
Сообщений: 21
30.07.2021, 19:15
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 <vector>
#include <cctype>
#include <algorithm>
#include <iterator>
 
using namespace std;
 
#define ll long long
 
bool OK(vector<ll>h, int L, int n, int m) {
    ll res = 0;
    for (int i = 0; i < n; i++) {
        res += (h[i] + L - 1) / L;
    }
    return (res <= m) ? true : false;
}
 
int main() {
    int n;
    cin >> n;
    vector<ll> h(n);
    vector<ll> ::iterator it;
    for (int i = 0; i < h.size(); ++i) {
        cin >> h[i];
    }
    int m;
    cin >> m;
    if (m < n) {
        cout << -1;
    }
    else {
        ll l = 0;
        it = max_element(h.begin(), h.end());
        ll r = *it;
        while (r-l>1) {
            int L = (r + l) / 2;
            (OK(h, L, n, m)) ? r = L: l = L;
        }
        cout << r;
    }
}
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
31.07.2021, 11:39
Bk324, непонятно почему в функцию вектор передается не по ссылке,
а работоспособность пусть ТС проверяет, на сириусе ))

Добавлено через 6 минут
А вообще подобные задачи решаются только математическим анализом ТЗ,
тут сразу скажу не для школьников оснастка такая, нужен опыт и знания которых в школе
(в моей школе в мое время точно такого не учили ) не дают.
На моей памяти даже мат. индукцию даже не проходили.

Может в ВУЗах, на тех. спец. с мат. уклоном, не иначе, а тут школоту штурмуют =)
Хотя задача и не кажется сложной, но мне лично лень ею всерьез заниматься.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,538
Записей в блоге: 1
31.07.2021, 11:44
Цитата Сообщение от SmallEvil Посмотреть сообщение
А вообще подобные задачи решаются только математическим анализом ТЗ,
тут сразу скажу не для школьников оснастка такая, нужен опыт и знания которых в школе
(в моей школе в мое время точно такого не учили ) не дают.
На моей памяти даже мат. индукцию даже не проходили.
в физматшколах всё дают. ИМХО, именно народ из физматшкол и надо награждать поездкой в Сириус, а не всяких простаков.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
31.07.2021, 12:13
Kuzia domovenok, складывается ощущение, что ты завидуешь.
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
31.07.2021, 12:59
Я б суммы как-то так считал, чтоб по стопицот раз не складывать/делить всякое:

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
43
44
45
46
47
48
49
int foo(std::vector<int> &h, int m)
{
    if(h.size() > m) return -1;
 
    std::sort(h.rbegin(), h.rend());
 
    auto check = [&h](int x, int m)
    {
        int mlt = h.front() / x + (h.front() % x > 0);
        int pwr = (mlt - 1) * x;
 
        auto left = h.begin();
        while(left != h.end())
        {
            auto right = std::find_if(left, h.end(), [&pwr](auto a){ return a <= pwr; });
            m -= std::distance(left, right) * mlt;
 
            if(m < 0) return false;             //
            if(right == h.end()) return true;   //
 
            while(*right <= pwr)
            {
                --mlt;
                pwr -= x;
            }
            left = right;
        }
        return m >= 0;
    };
    
    int result = h.front();
    int l = 0;
    int r = h.front() + 1;
    
    while(r - l > 1)
    {
        int x = (l + r) / 2;
        if(check(x, m))
        {
            result = x;
            r = x;
        } else {
            l = x;
        }
    }
    
    
    return result;
}
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
31.07.2021, 13:27
А мне вот интересно у Сириуса есть код такой ? с таким лимитом по времени ?
Или просто таки дрочат народ ))
Хоть сказали сколько лимит при каких данных, как многие задачи на кодеварс.
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
31.07.2021, 13:49
Цитата Сообщение от SmallEvil Посмотреть сообщение
А мне вот интересно у Сириуса есть код такой ? с таким лимитом по времени ?
В смысле?

Цитата Сообщение от SmallEvil Посмотреть сообщение
Или просто таки дрочат народ ))
Хоть сказали сколько лимит при каких данных, как многие задачи на кодеварс.
Если жалуются "слишком долго" - наверное должно быть, как есть во всех проверялках что я видел. Другое дело, да, не удосуживаются ничем помочь, dmitrii2000 тут, видимо, как на госуслуги пришёл или в клуб "желающих ответственно помочь абитуриенту", где каждый телепат и об этом на вывеске написано
0
 Аватар для YUEN HOIFEF
252 / 185 / 47
Регистрация: 31.01.2021
Сообщений: 934
02.08.2021, 10:45
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include<iostream>
 
using namespace std;
 
 
 
bool read_input_as_correct( int &x, int Min, int Max )
 {
cin >> x;
 
if( x < Min || x > Max )
 {
 cout << "Incorrect user input. Enter again: ";
 read_input_as_correct( x, Min, Max );
 }
return true;
 }
 
long long magic_quantity( int n, int *h, int supposed_X )
 {
long long mq = 0;
int remainder = 0;
 
for( int i=0; i<n; i++ )
 {
 
 if( supposed_X >= h[ i ] )
  {
  mq += supposed_X;
  }
 else
  {
  mq += h[ i ];
  remainder = h[ i ] % supposed_X;
  if( remainder ) mq += ( supposed_X - remainder );
  }
 }
return mq;
 }
 
 
 
 
 
int main()
 {
int NO_MONSTERS = 2; // Namber Of Mansters
int heros_stamina = 0; // Hero`s stamina
int i, flag=-1;
long long Z=0;
int *monster_health;
 
 
// GET USER INPUT
cout << "\n --Enter data--\n";
 
cout << "1. Namber of mansters\n   (you can enter a number between 1 and 100000): ";
read_input_as_correct( NO_MONSTERS, 1, 100000 );
monster_health = new int[ NO_MONSTERS ];
if( !monster_health ) return 1;
 
cout << "2. The health of each monster\n   (you can enter a number between 1 and 1000000):\n";
 
for( i=0; i<NO_MONSTERS; i++ )
 {
 cout << "Monster numer " << i+1 << " health: ";
 read_input_as_correct( monster_health[ i ], 1, 1000000 );
 
//cout << "-----  " << monster_health[ i ] << " ----";
//getch();
 }
 
cout << "3. Hero`s stamina\n   (you can enter a number between 1 and 1000000): ";
read_input_as_correct( heros_stamina, 1, 1000000 );
// - - - - - - - -
 
 
for( int c=1; c<=heros_stamina; c++ )
 {
 Z = magic_quantity( NO_MONSTERS, monster_health, c );
 if( heros_stamina - Z/c >= 0 )
  {
  flag = c;
  break;
  }
 }
 
cout << flag << endl;
 
delete monster_health;
return 0;
 }
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,538
Записей в блоге: 1
02.08.2021, 12:09
Croessmah, как раз наоборот, я отрицательно реагирую на коммент "ууу, сложна, тут матан нужон".
Может как раз те, кому сложно завидуют?
0
 Аватар для Tim977
40 / 12 / 0
Регистрация: 05.08.2022
Сообщений: 12
23.08.2022, 22:40
Цитата Сообщение от Новичок Посмотреть сообщение
Может бин. поиск по ответу ?
Да, именно его и надо использовать, задача не сложная, все тесты прошли)

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>
#include <vector>
#include <algorithm>
 
using namespace std;
 
bool f(vector<int> h, int x, int n, int m)
{
    int ans = 0;
    for (int i = 0; i < n; i++) {
        ans += (h[i] + x - 1) / x;
    }
    return ans <= m;
}
 
int main()
{
    int n, m, temp;
    cin >> n;
    vector<int> h;
    for (int i = 0; i < n; i++) {
        cin >> temp;
        h.push_back(temp);
    }
    cin >> m;
    if (n <= m) {
        int l = 0, r = *max_element(h.begin(), h.end());
        while (r > l + 1) {
            int x = (r + l) / 2;
            if (f(h, x, n, m)) r = x;
            else l = x;
        }
        cout << r;
    }
}
По вопросам пишите, всегда готов ответить
Всем хорошего дня!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.08.2022, 22:40

Андрей играет в новую игру, в которой герой сражается с монстрами
Андрей играет в новую игру, в которой герой сражается с монстрами. Герой наносит монстру удары. Один удар отнимает у монстра одну единицу...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru