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

Задача про Лестницу

28.02.2013, 13:02. Показов 12013. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Условия формулируются так:

Есть лестница высотой в n ступенек (плюс «нулевая» - площадка, где мы стоим вначале). На каждой ступеньке написано число (положительное или отрицательное). На стартовой площадке и на последней ступеньке - нули. Можно ступать либо на следующую ступеньку либо перескакивать через одну. Напишите алгоритм, определяющий, как надо шагать, чтобы сумма чисел на пройденных ступеньках (тех, на которые мы ступали) была максимальна.

Мой код:

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
#include<iostream>
#include<vector>
#include<cstdio>
 
using namespace std;
 
vector<int> stairs;
 
int main()
{
    int n = 0;
    cin >> n;
 
    stairs.resize(n + 2);
 
    for(int i = 0; i < n + 2; i++)
    {
        int num;
        scanf("%d", &num);
        stairs[i] = num;
    }
 
    int cur=0, sum=0;
 
    while(cur < n)
    {
        if(stairs[cur + 1] == stairs[cur + 2] || stairs[cur + 1] < stairs[cur + 2])
        {
            sum += stairs[cur + 2];
            cur += 2;
        }
        else 
        {
            sum += stairs[cur + 1];
            cur += 1;
        }
    }
 
    printf("%d\n", sum);
 
    //system("pause");
    return 0;
}
На вход подается кол-во ступенек и числа на них.
Формат такой:

4
0 -58 -39 93 -92 0

я указываю, что на нулевой ступеньке число =0 и на последней=0
выход - максимальная сумма ступенек.

Мне задачу забраковали. Сказали, что в ней ошибка.

Может быть её и нет. (Я склоняюсь к этому варианту) Программу проверяли видимо руками, тест на котором не верно - не сказали.

Я вводила несколько тестов, и моя программа выдавала верный результат. Верную сумму.
Не подскажете в чем может быть проблема? И существует ли эта ошибка впринципе?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.02.2013, 13:02
Ответы с готовыми решениями:

Задача про взлом кода из книги Эрика Фримена про основы javascript в конце 5 главы.
читаю книгу Эрика Фримена про основы javascript.В конце 5 главы есть задачка про взлом кода.Никак не могу понять как ее решить.НЕ понимаю...

Задача на перебор вариантов. Задача Л.Эйлера. Про чиновника
Задача Л.Эйлера. Некий чиновник купил лошадей и быков на сумму 1770 талеров. За каждую лошадь он уплатил по 31 талеру, а за каждого быка по...

Нарисовать лестницу
Разработать программу для рисования лестницы. Пользователь вводит количество ступенек. Использовать цикл for(только через него) Пример:...

8
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
28.02.2013, 13:15
Цитата Сообщение от fetchhell Посмотреть сообщение
if(stairs[cur + 1] == stairs[cur + 2] || stairs[cur + 1] < stairs[cur + 2])
для "меньше или равно" есть оператор <=

Добавлено через 1 минуту
Цитата Сообщение от fetchhell Посмотреть сообщение
if(stairs[cur + 1] == stairs[cur + 2] || stairs[cur + 1] < stairs[cur + 2])
* * * * {
* * * * * * sum += stairs[cur + 2];
* * * * * * cur += 2;
* * * * }
* * * * else
* * * * {
* * * * * * sum += stairs[cur + 1];
* * * * * * cur += 1;
* * * * }
Это неверное решение задачи. Точнее, я пока не уверен, что всё так просто. Лучше используй динамическое программирование.
0
0 / 0 / 0
Регистрация: 18.02.2013
Сообщений: 5
28.02.2013, 13:16  [ТС]
Понятно. Я быстро писала, возможно где-то ошиблась.
Можно динамику. Можно через такие условия. Никто не ограничивает.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
28.02.2013, 13:26
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<cstdio>
 
using namespace std;
 
vector<int> stairs;
vector <int> records;
int main()
{
    int n = 0;
    cin >> n;
 
    stairs.resize(n + 2);
    records.resize(n + 2);
    for(int i = 0; i < n + 2; i++)
    {
        int num;
        scanf("%d", &num);
        stairs[i] = num;
    }
 
 
    records[0]=stairs[0]; records[1]=stairs[1];
    int cur=0, sum=0;
    for(int i = 2; i < n + 2; i++){
        if(records[i-1]>records[i-2]) records[i]=stairs[i]+records[i-1];
        else                                  records[i]=stairs[i]+records[i-2];
    }
 
    printf("%d\n", records[n+1]);
 
    //system("pause");
    return 0;
}
1
0 / 0 / 0
Регистрация: 18.02.2013
Сообщений: 5
28.02.2013, 13:31  [ТС]
Я поняла. Спасибо. Больше не нужно.
0
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
28.02.2013, 13:38
Я вижу 2 решения
1. Перебор всех возможных ходов
2. Перескок максимальной суммы отрицательных чисел

Перенёс код себе. (к сожалению у меня нету std и всяких vektor)
Но немного изменил по логике.
Вот первый пример - и ответ неверен.

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 "stdafx.h"
 
#include<iostream>
#include<vector>
#include<cstdio>
 
 
int main()
{
    int n = 0;
    int stairs[100];
 
    stairs[0]=0;
    stairs[2]=2;
    stairs[3]=2;
    stairs[4]=2;
    stairs[5]=2;
    stairs[6]=2;
    stairs[7]=2;
    stairs[8]=2;
    stairs[9]=0;
   
   
 
    n=7;
    int cur=0, sum=0;
 
    while(cur < n)
    {
        if(stairs[cur + 1] == stairs[cur + 2] || stairs[cur + 1] < stairs[cur + 2])
        {
            sum += stairs[cur + 2];
            cur += 2;
        }
        else 
        {
            sum += stairs[cur + 1];
            cur += 1;
        }
    }
 
    printf("%d\n", sum);
    scanf("%d",cur);
 
    //system("pause");
    return 0;
}
Пишет сумма = 8
0
0 / 0 / 0
Регистрация: 10.12.2019
Сообщений: 1
10.12.2019, 19:17
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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int main()
{
    int n;
    cin >> n;
    vector<int> a;
    vector<int> dp;
    dp.resize(n+1);
    a.resize(n+1);
    for (int i = 1; i < n+1; i++)
    {
        cin >> a[i];
    }
    dp[0] = 0;
    dp[1] = a[1];
    for (int i = 2; i < n + 1; i++)
    {
        dp[i] = max(dp[i - 1] + a[i], dp[i - 2] + a[i]);
    }
 
    cout << dp[n];
}
Тема старая, но тем не менее отвечу. Вот, как мне кажется, самое простое решение. Динамикой. a[ ] - массив с числами, написанными на ступеньках. dp[ ] - массив с максимальными значениями, которые мы можем получить, дойдя до каждой из ступенек. Только в данном случае решение для любого числа, написанного на последней ступеньке, а не именно для 0.
0
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
10.12.2019, 22:54
Мда, много времени прошло с 2013. Но раз уж мне на почту пришел ответ - то и я отвечу.
Подумав минут 7 понял что задача реально классная и имеет элегантнейшее решение.
Для всех ступенек начиная с конца определяем максимально возможную сумму очей если мы на ней окажемся


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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int main()
{
    int n;
    cin >> n;
    vector<int> Values;
    vector<int> MaxScore;
    
for (int i = 0; i < n; i++)
    {
        int value;
        cin >> value;
    Values.push_back(value);
    MaxScore.push_back(0);
    }
     MaxScore[n-1] = Values[n-1];
     MaxScore[n-2] = Values[n-2] + max(0, Values[n-1]);
 
   for (int i = n-3; i >=0; i--)
    {
        MaxScore[i] = Values[i] + max(MaxScore[i+1], MaxScore[i+2]);
    }
 
 
 
 
    cout << "something";
}
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
11.12.2019, 00:13
Stelob, Kuzia domovenok, nefton, собственно это всё вариации одного и того же решения.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.12.2019, 00:13
Помогаю со студенческими работами здесь

Комбинаторика подъёма на лестницу
Всем привет! Имеется лестница из 10 ступенек, подниматься можно наступая на каждую ступеньку или через одну. Вывести на экран все варианты...

Массив описывает лестницу
Дан упорядоченный массив целых чисел. Он описывает лестницу, разность соседних элементов - высота ступеней. Имеется некое существо,...

Комбинаторика подъёма на лестницу
Всем привет! Имеется лестница из 10 ступенек, подниматься можно наступая на каждую ступеньку или через одну. Вывести на экран все варианты...

Нарисовать лестницу из восьми перекладин
Создать программу, которая реализует графическими средствами языка программирования Pascal такое статическое изображение: лестницу из...

Написать процедуру, которая рисовала бы лестницу
Написать процедуру, которая рисовала бы лестницу. Данные: число ступенек, длина самой маленькой, величина, на которую изменяется длина...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru