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

Необходимо разобраться в программе

08.11.2019, 17:15. Показов 2931. Ответов 3
Метки c++ (Все метки)

Имя входного файла: стандартный ввод
Имя выходного файла: стандартный вывод
Ограничение по времени: 2 секунды
Ограничение по памяти: 512 мебибайт
В комнате стоит очень длинный узкий стол, на котором слева направо расположено n продуктов
животного и растительного происхождения. Чтобы не углубляться в тонкости пищевой индустрии,
будем их называть кусками мяса (meat) и кочанами капусты (cabbage). Если согласно этому упрощению каждому из продуктов сопоставить букву «m» в случае мяса и «c» в случае капусты, получится
строка из n символов.
Возле левого края стола встала гимнастка Алина, а возле правого — веган Ваня. Они желают
съесть всю еду со стола, при этом Алина может есть только мясо, а Ваня — только капусту. При
этом по правилам, принятым в этой комнате, человек может брать только ближайший продукт к его
краю стола и, если он взял что-то, то он должен это сразу съесть. Эту процедуру можно повторять
несколько раз: так, если три ближайших к Ваниному краю стола продукта — это три кочана капусты,
то он может съесть от нуля до трёх из этих кочанов; если же ближайший к Ване продукт — мясо,
то Ваня вообще не может ничего есть. Кроме того, двум людям нельзя стоять с одного края стола,
но при этом два человека с разных краёв стола могут поменяться местами, если захотят. Подумав,
Алина и Ваня поняли, что правила действительно позволяют им съесть всё, что лежит на столе, за
какое-то число обменов, но, поскольку стол длинный, меняться местами довольно долго. Поэтому
Алина и Ваня попросили найти вас наименьшее достаточное число обменов.
Формат входных данных
В первой строке находится целое число n — количество продуктов питания на столе
(1 6 n 6 200 000). Во второй строке записано n строчных латинских букв, каждая из которых — либо
«m» для мяса, либо «c» для капусты. Символы указаны в том же порядке, в каком соответствующие
им продукты расположены на столе.
Формат выходных данных
Выведите целое число — наименьшее количество раз, которое могут поменяться местами Алина
и Ваня, чтобы съесть со стола всё мясо и всю капусту

Примеры
стандартный ввод
14
mmmmmmmccccccc
стандартный вывод
0




10
cccmmmmmmm
стандартный вывод
1

7
mcmcmcm
стандартный вывод
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
#include <iostream>
 
 
using namespace std;
 
int main (){
 int n_prod,itg;
 cin >> n_prod;
 char prod [n_prod];    
 for(int i = 0 ; i < n_prod; i++){
    cin >> prod [i];
    
 }  
 int k = 0;
 int l = 0;
 int h = 0;
 int c = n_prod;
 for(int i = 0 ; k + l != n_prod; i++){
  if(prod [i] == 'm'){
    while (prod [h] !='c'){
        k++;
        h++;
    }
  }else{
     
  if(prod [c] == 'c'){
      while (prod [c] !='m'){
        l++;
        c--;
    }
    }
  if(prod [h] =='c' && prod [c] == 'm')
      itg++;
      swap(h,c);
    
  }
    
 }  
 cout << itg;   
    
    
    
     
    
 return 0;  
}
В общем пишет просто: прекращение работы программы

Что не так подскажите ?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.11.2019, 17:15
Ответы с готовыми решениями:

Необходимо разобраться в программе
Электронные часы - 2 Электронные часы показывают время в формате h:mm:ss, то есть сначала...

Необходимо разобраться в программе
упражнение из С.Прата глава 8 номер 4 #include &lt;iostream&gt; #include &lt;cstring&gt; using...

Необходимо разобраться в программе
задача такая:Уравнение Решите в целых числах уравнение: √ax+b=c, (под корнем ) a,...

Необходимо разобраться в программе
В общем такая ситуация три последних текста не проходит программа написано превышен лимит памяти ...

3
6745 / 4540 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
Записей в блоге: 1
08.11.2019, 17:39 2
Цитата Сообщение от Distox Посмотреть сообщение
В общем пишет просто: прекращение работы программы
Что не так подскажите ?
Вот здесь выход за границу массива if(prod [c] == 'c'){
Если нужен последний элемент, то сделай int c = n_prod - 1;

Добавлено через 1 минуту
itg не проинициализирован int n_prod,itg = 0;

Добавлено через 1 минуту
Цитата Сообщение от Distox Посмотреть сообщение
while (prod [c] !='m'){
        l++;
        c--;
Здесь, если в массиве нет буквы 'm', то с уйдёт в минус
0
2 / 2 / 0
Регистрация: 14.05.2019
Сообщений: 42
08.11.2019, 23:31  [ТС] 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
#include <iostream>
 
 
using namespace std;
 
int main (){
 int n_prod,itg;
 itg = 0;
 cin >> n_prod;
 char prod [n_prod];    
 for(int i = 0 ; i < n_prod; i++){
    cin >> prod [i];
    
 }  
 int k = 0;
 int l = 0;
 int h = 0;
 int c = n_prod - 1;
 for(int i = 0 ; k + l != n_prod ; i++){
  if(prod [i] == 'm'){
    while (prod [h] =='m'){
        k++;
        h++;
    }
  }else{
     
  if(prod [c] == 'c'){
      while (prod [c] =='c'){
        l++;
        c--;
    }
    }
  if(prod [h] =='c' && prod [c] == 'm')
      itg++;
      swap(h,c);
    
  }
    
 }  
 cout << itg;   
    
    
    
     
    
 return 0;  
}
Но все равно во втором тесте завершение работы

Я что-то не учел или неправильно понял?
0
815 / 502 / 211
Регистрация: 19.01.2019
Сообщений: 1,196
09.11.2019, 03:31 4
Лучший ответ Сообщение было отмечено Distox как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
int main()
{
    size_t len, cnt(0);
    bool sw(false);
    char ch;
    std::cin >> len;
    while (len--) {
        std::cin >> ch;
        if (!(ch == 'm' ^ sw)) {
            sw = !sw;
            ++cnt;
        }
    }
    std::cout << cnt / 2;
    return 0;
}
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.11.2019, 03:31

Необходимо разобраться
Упражнение взято из книги С.Прата глава 8 упражнение 4. #include &lt;iostream&gt; #include...

Необходимо разобраться с заданием
Здравствуйте. Ребят, подскажите пожалуйста начинающему, что именно нужно сделать в этом задании?

Необходимо разобраться с конструктором!
class Complex { public: // Конструктор по умолчанию // (в данном случае является также и...

Необходимо разобраться с кодом
Объясните пожалуйста что делает эта программа #include &lt;vector&gt; #include &lt;cstdio&gt; using...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru