2 / 2 / 0
Регистрация: 03.05.2020
Сообщений: 202

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

27.07.2021, 04:48. Показов 7937. Ответов 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
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,335
30.07.2021, 12:54
irthgr, я не в курсе, что там за сириус, но ты всё же обдумай - ведь программирование это явно не твоё
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,544
Записей в блоге: 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
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,335
30.07.2021, 16:45
irthgr, всё с вами, бездельниками, понятно )
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
30.07.2021, 16:47
Я бы сделал иначе. Кто сам сделал - тех в Сочи, кто списал - на Кубу.
1
фрилансер
 Аватар для Алексей1153
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,335
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
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,335
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,544
Записей в блоге: 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,544
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru