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

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

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

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

Есть лестница высотой в 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2013, 13:02
Ответы с готовыми решениями:

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

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

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

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

8
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
28.02.2013, 13:15 2
Цитата Сообщение от 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  [ТС] 3
Понятно. Я быстро писала, возможно где-то ошиблась.
Можно динамику. Можно через такие условия. Никто не ограничивает.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
28.02.2013, 13:26 4
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  [ТС] 5
Я поняла. Спасибо. Больше не нужно.
0
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
28.02.2013, 13:38 6
Я вижу 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 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
#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 8
Мда, много времени прошло с 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
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
11.12.2019, 00:13 9
Stelob, Kuzia domovenok, nefton, собственно это всё вариации одного и того же решения.
1
11.12.2019, 00:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2019, 00:13
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru