Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
8 / 0 / 0
Регистрация: 21.04.2018
Сообщений: 13

Дана шеренга из n психов. На каждом ходе каждый псих убивает своего соседа справа в шеренге

11.05.2018, 11:45. Показов 1675. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дана шеренга из n психов. Каждому психу дан идентификатор от 1 до n
На каждом ходе каждый псих, имеющий идентификатор больше, чем у психа справа (если такой есть) убивает своего соседа справа в шеренге
Вам дано исходное расположение психов в шеренге. Подсчитайте, сколько необходимо ходов до момента времени, после которого никто никого не будет убивать.



помогите написать алгоритм

входные данные
10
10 9 7 8 6 5 3 4 2 1
выходные данные
2

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
      #include <iostream>
        #include <stack>
 
        using namespace std;
 
        int main() {
            stack <int> q;
            int a, n, b, j = 0, c;
            cin >> n;
            for(int i = 0; i < n; i++){
                cin >> a;
                q.push(a);
            }
 
            for(int i = 0; i < q.size(); i++){
                if(q.top() > q.top() + 1){
                    j = j + 1;
                }
            }
 
            cout << j;
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.05.2018, 11:45
Ответы с готовыми решениями:

Преобразовать массив так, чтобы каждый элемент был как сумма себя и своего соседа впереди
Преобразовать массив A(i) в массив B(i) так, чтобы в новом массиве каждый элемент получался бы как сумма себя и своего соседа впереди....

Определить, имеются ли в шеренге школьников хотя бы два соседа, родившиеся в один и тот же день недели
Тема &quot;Массивы (цикл-пока или цикл-до)&quot;. Шеренгу образовали школьники-одногодки, родившиеся в один и тот же месяц. Определить, имеются...

Количество элементов массива, которые больше своего соседа слева
К сожалению, я совсем не умею работать в паскале. Может кто-то сможет мне помочь. Составить программу, которая заполняет массив...

26
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
11.05.2018, 12:20
А убийства происходят слева направо или справа налево?

Добавлено через 2 минуты
Хотя это, наверное, не имеет значения
1
Модератор
Эксперт NIX
 Аватар для NeoMatrix
8532 / 3375 / 105
Регистрация: 24.05.2011
Сообщений: 14,605
Записей в блоге: 8
11.05.2018, 12:59
105
0
8 / 0 / 0
Регистрация: 21.04.2018
Сообщений: 13
11.05.2018, 15:26  [ТС]
с слева направо
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
11.05.2018, 20:39
Цитата Сообщение от MrGluck Посмотреть сообщение
А убийства происходят слева направо или справа налево?
Хороший вопрос, imho. Условие, действительно, неоднозначно, но мне кажется, что из :
Цитата Сообщение от saba16 Посмотреть сообщение
каждый псих, имеющий идентификатор больше, чем у психа справа
делает всех равноправными. Нигде не сказано, что есть порядок очерёдности ходов участников шеренги. Следовательно, логично предположить, что ход имеет смысл для всей шеренги, особенно если считать, что убийство прсиха психом не обязательно мгновенный процесс, запрещающий тому кого убивают, убить кого-то ещё.
Вообще, подсознательно, - нездоровая задачка и думать о ней не хочется.
Если бы псих дарил психу мерс и тот на нём уезжал покидая очередь, то могло бы быть интереснее. Тут ещё можно бы было поиграть условием возможности "передаривания" только что полученного мерса (да/нет). То есть, жизнь умнее и богаче по возможностям, а не только морально здоровее, чем смерть.
2
11.05.2018, 21:06

Не по теме:

Дикое задание.

0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
11.05.2018, 21:43
Цитата Сообщение от saba16 Посмотреть сообщение
входные данные
10
10 9 7 8 6 5 3 4 2 1
выходные данные
2
Неправильный ответ.
Самый первый псих с номером 10 или его собратья перебьет всех, поскольку его номер больше и он всегда будет правее.
Поэтому ответ 9 для этого набора.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
11.05.2018, 21:51
Цитата Сообщение от Nishen Посмотреть сообщение
Дикое задание.
Да уж. Кстати, мои рассуждения о
Цитата Сообщение от IGPIGP Посмотреть сообщение
что ход имеет смысл для всей шеренги, особенно если считать, что убийство прсиха психом не обязательно мгновенный процесс, запрещающий тому кого убивают, убить кого-то ещё.
Не имеют смысла, потому что в этом случае выживает самый "могучий". Значит, - поочереди они "ходят".

Добавлено через 6 минут
Цитата Сообщение от Просто Саша Посмотреть сообщение
Самый первый псих с номером 10 или его собратья перебьет всех
первый псих с номером 10, если предположить что каждый успевает сделать или не сделать своё чёрное дело в каждом ходу.
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
#include <iostream>
#include <list>
using namespace std;
 
void whoAreToDie(list<int> &lps, list<list<int>::const_iterator>& listIteratorsToDie)
    {
        listIteratorsToDie.clear();
        if(lps.empty())return ;
 
        list<int>::const_iterator it_beg = lps.begin(), it_end = lps.end(), it = it_beg;
            ++it;
            while(it != it_end)
                {
                    if(*it<*it_beg)listIteratorsToDie.push_back(it++);
                }
    }
 
void KillemAll(list<int> &lps, list<list<int>::const_iterator>& listIteratorsToDie)
    {
        list<list<int>::const_iterator>::const_iterator it_beg = listIteratorsToDie.begin(), it_end = listIteratorsToDie.end();
            while(it_beg != it_end)
            {
                lps.erase(*it_beg);
                ++it_beg;
            }
    }
 
template<class T> void prnCont(T l, T r)
    {
        while(l != r) 
            {
                cout << *l++ <<' ';
            }
    cout<<endl;
    }
 
int main(int argc, char* argv[])
{
    int ps[]={10, 9, 7, 8, 6, 5, 3, 4, 2, 1};
    int ps_sz = sizeof(ps)/sizeof(*ps);
 
    list<int> lps(ps, ps+ps_sz);
    list<list<int>::const_iterator> listIteratorsToDie;
    prnCont(lps.begin(), lps.end());
 
        do  {
                whoAreToDie(lps, listIteratorsToDie);
                KillemAll(lps, listIteratorsToDie);
            }while(!listIteratorsToDie.empty());
 
        prnCont(lps.begin(), lps.end());
 
cout<<endl;
system("pause");
return 0;
}
то есть, нет смысла считать что они все за ход что-то успеют. Тогда ещё проще. (УЖОС!)
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
11.05.2018, 21:57
А у меня вот так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int kills {0};
deque<int> psihi_before {10, 9, 7, 8, 6, 5, 3, 4, 2, 1};
vector<int> psihi_after;
    
psihi_after.push_back(psihi_before.front());
psihi_before.pop_front();
 
while (!psihi_before.empty())
{
    if (psihi_after.back() > psihi_before.front())
        ++kills;
    else
        psihi_after.push_back(psihi_before.front());
    psihi_before.pop_front();
}
 
cout << "Number of kills = " << kills << endl;
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
11.05.2018, 21:59
Цитата Сообщение от saba16 Посмотреть сообщение
10 9 7 8 6 5 3 4 2 1
Да, задачка неоднозначна... 10 убил 9. А 9 убил 7 или не успел? (на это уже обратил внимание уважаемый IGPIGP)
Хорошо, пусть убил. Тогда его соседом стал 7? Или он остался без соседа?

Не по теме:

Ну и навеяло стихотворение чудесного поэта Володи Уфлянда
Мы племя людоедов
У нас обычай есть -
Кусаться за обедом,
Стремясь друг друга съесть.
А если кто соседа
Не сможет съесть живьем -
Тот будет без обеда.
Вот так вот и живем...
Отца и мать я помню
Съел в юные года.
И вот теперь я полный
И круглый сирота


....
2
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
11.05.2018, 22:03
Цитата Сообщение от Байт Посмотреть сообщение
Да, задачка неоднозначн
Задача на самом деле однозначна.
Требуется просто посчитать число убийств.
И неважно кто будет убивать первым. Ответ всегда будет одним и тем же, поскольку убитые члены последовательности выпадают из нее.
То есть все кто должны быть убиты, будут убиты только один раз и неважно кем.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
11.05.2018, 22:11
Цитата Сообщение от Просто Саша Посмотреть сообщение
И неважно кто будет убивать первым.
Имхо, все-таки важно. Если убиение идет справа налево, то после первого хода остается 10 8 4. А если слева направо - 10 8 5 4 2
В первом случае "игра" кончается на 2-м ходе. (10) во втором позиция после 2-го хода 10 5 2 После третьего 10 2 И только на 4-м ходу все довольны.
Или я чего-то не понимаю?
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
11.05.2018, 22:14
saba16, Log (n)
Останется один псих #1.
т.е. на кажом ходу количество психов просто делится на 2. Отсюда имеем что задача уничтожения населения этой психушки имеет логарифмическую сложность.
0
354 / 135 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
11.05.2018, 22:20
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
saba16, Log (n)
1 2 3
ответ тоже log?
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
11.05.2018, 22:26
Цитата Сообщение от Байт Посмотреть сообщение
Имхо, все-таки важно. Если убиение идет справа налево, то после первого хода остается 10 8 4. А если слева направо - 10 8 5 4 2
Убиение всегда идет слева направо, поскольку убивает всегда левый, номер которого больше чем у его соседа справа.
0
354 / 135 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
11.05.2018, 22:29
Цитата Сообщение от Просто Саша Посмотреть сообщение
Убиение всегда идет слева направо, поскольку убивает всегда левый, номер которого больше чем у его соседа справа.
Хочешь фокус покажу? Только ты сразу не пугайся О МОЙ БОГ!
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
11.05.2018, 22:38
Если уж в этой задаче копаться скрупулезно, то вопрос можно ставить как считать слева и справа, относительно наблюдателя, который стоит лицом к строю, или с точки зрения психа в шеренге.
Я решал задачу с точки зрения наблюдателя. Если Вы хотите решить ее относительно психов в строю, то для этого всего лишь нужно развернуть последовательность.
Но это уже относится не к алгоритму, а к небрежной постановке задачи.

Добавлено через 1 минуту
Цитата Сообщение от Ромаха Посмотреть сообщение
Хочешь фокус покажу? Только ты сразу не пугайся О МОЙ БОГ!
А чему там пугаться то?

Добавлено через 5 минут
Возьмите разверните эту последовательность и получите вашу двойку.
Я же говорю, задача поставлена нечетко, поэтому решать ее можно относительно ЛЮБОЙ СИСТЕМЫ ОТСЧЕТА.
Да и кстати, на досуге попробуйте доказать, что сумма убийств при рассмотрении задачи в двух направлениях всегда равна длине последовательности, увеличенной на 1.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
11.05.2018, 22:56
Неважно в какой последовательности убивать. Судя по примеру вверху за ход умирает всегда 1 псих.

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
#include <iostream>
#include <vector>
#include <cstdlib>
 
using namespace std;
 
int main()
{
    int n, count = 0;
 
    cin >> n;
 
    vector<int> m(n);
 
    for (int i = 0; i < n; ++i)
        cin >> m[i];
 
    for (int i = 0; i < n - 1; ++i)
    {
        if (m[i] < m[i + 1])
        {
            ++count;
            m.erase(m.begin() + i + 1);
            i = -1;
            --n;
        }
    }
 
    cout << count << endl;
 
    system("pause");
    return 0;
}
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
12.05.2018, 00:33
Если двойка это количество ходов, то у меня только 4 и 3 получилось. Кто убьёт быстрее?
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
93
94
95
96
97
98
99
#include <iostream>
#include <list>
using namespace std;
 
void whoAreToDie(list<int> &lps, list<list<int>::const_iterator>& listIteratorsToDie)
    {
        listIteratorsToDie.clear();
        if(lps.empty())return ;
 
        list<int>::const_iterator it_beg = lps.begin(), it_end = lps.end(), it = it_beg;
            ++it;
            while(it != it_end)
                {
                    if(*it<*it_beg){
                        listIteratorsToDie.push_back(it);                       
                    }                   
                    ++it;
                    ++it_beg;//в первом варианте забыл этот инкрементировать, но на вывод это не влияет - 10 только выживет :) 
                    
                }
    }
 
void KillemAll(list<int> &lps, list<list<int>::const_iterator>& listIteratorsToDie)
    {
        list<list<int>::const_iterator>::const_iterator it_beg = listIteratorsToDie.begin(), it_end = listIteratorsToDie.end();
            while(it_beg != it_end)
            {
                lps.erase(*it_beg);
                ++it_beg;
            }
    }
 
template<class T> void prnCont(T l, T r)
    {
        while(l != r) 
            {
                cout << *l++ <<' ';
            }
    cout<<endl;
    }
 
 bool KillOneOrNobody(list<int> &lps)
    {
        if(lps.empty())return false;
 
        list<int>::const_iterator it_beg = lps.begin(), it_end = lps.end(), it = it_beg;
            ++it;
            bool killHappened = false;
            while(it_beg != it_end && it != it_end)
                {
                    cout<<*it_beg<<' '<<*it<<endl;
                    if(*it<*it_beg){
 
                        lps.erase(it);                      
                        killHappened = true;
                        ++it_beg;
                        if(it_beg == it_end)break;
                        it=it_beg;
                        ++it;
                    }else{
                    ++it_beg;
                    ++it;
                    }
                        
                }
    return killHappened;
    }
 
int main(int argc, char* argv[])
{
    int ps[]={10, 9, 7, 8, 6, 5, 3, 4, 2, 1};
    int ps_sz = sizeof(ps)/sizeof(*ps);
 
    list<int> lps1(ps, ps+ps_sz);
 
    prnCont(lps1.begin(), lps1.end());
int kill_count(0);
    while( KillOneOrNobody(lps1))
        ++kill_count;
    prnCont(lps1.begin(), lps1.end());
    cout<<"\nkill_count= "<<kill_count<<endl;
    
list<int> lps(ps, ps+ps_sz);
    
    list<list<int>::const_iterator> listIteratorsToDie;
    prnCont(lps.begin(), lps.end());
    kill_count=0;
        do  {
                whoAreToDie(lps, listIteratorsToDie);
                KillemAll(lps, listIteratorsToDie);
                ++kill_count;
            }while(!listIteratorsToDie.empty());
 
        prnCont(lps.begin(), lps.end());
cout<<"\nkill_count= "<<kill_count<<endl;
cout<<endl;
system("pause");
return 0;
}
0
354 / 135 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
12.05.2018, 00:42
Цитата Сообщение от IGPIGP Посмотреть сообщение
++kill_count;
* * * * * * }while(!listIteratorsToDie.empty());
Тут собака зарыта
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.05.2018, 00:42
Помогаю со студенческими работами здесь

Удалить те элементы массива, которые больше своего левого соседа
Здравствуйте! Возникла проблема с Паскалем: необходимо удалить те элементы массива, которые больше своего левого соседа (т.е элемент...

Вывести те элементы в наборе, которые меньше своего правого соседа
Дано целое число N (&gt; 1) и набор из N целых чисел. Вывести те элементы в наборе, которые меньше своего правого соседа, и количество K...

Вывести те элементы в наборе, которые меньше своего левого соседа
Помогите решит вот эти 2 задачи : 2)Дано целое число N (&gt;1) и набор N целых чисел. Вывести те элементы в наборе, которые меньше своего...

Вывести те элементы в наборе, которые меньше своего правого соседа
2. Дано целое число N(&gt;1) и набор из N целых чисел. Вывести те элементы в наборе, которые меньше своего правого соседа, колво К таких...

Вывести те элементы в наборе, которые меньше своего левого соседа
Дано целое число N (&gt; 1) и набор из N целых чисел. Вывести те эле- менты в наборе, которые меньше своего левого соседа, и количество K...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru