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

Прошу совета, как лучше написать данную программу!

12.05.2019, 14:30. Показов 314. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пусть задано число, решённых задач и в следующей строке перечислены номера задач в том порядке, в котором они решены.
Задача называется актуальной, если это первая по номеру ещё нерешенная учеником задача. Необходимо вывести число актальных задач, например для данного списка задач 3 1 5 4 8 105 2 6 10 9 7 13 15 14 533 16 11 12 19 18 17 220 актуальными являются 1, 2, 6, 7, 11, 12, 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
27
28
29
30
31
32
33
#include <iostream>
 
using namespace std;
 
int main()
{
    long int n, *t, max_i = 0, min_i = 0, p[10000] = { 0 }, c = 1, i;
 
    cin >> n;
 
    t = new long int[n];
 
    for (i = 0; i < n; i++)
    {
        cin >> t[i];
        if (t[i] < t[min_i]) min_i = i;
        if (t[i] > t[max_i]) max_i = i;
        p[t[i] - 1] = i + 1;
    }
 
    long int maxNum = t[max_i], minNum = t[min_i];
    
    for (i = minNum; i < maxNum; i++)
        if (p[i] > min_i + 1 && p[i] < n)
        {
            c++;
            min_i = p[i] - 1;
        }
    
    cout << c << endl;
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.05.2019, 14:30
Ответы с готовыми решениями:

Прошу совета как написать скрипт с действиями для Win 10
Всем доброго и хорошего дня! Прошу помощи - нужно написать скрипт, чтоб он: 1) Включить...

Прошу совета, впервые пишу программу с БД
Всем добрый день. Впервые пишу программу с использованием ДБ (MySQL). Есть таблицы с внешними...

Как написать данную программу
в файле заданы натуральные числа подсчитать количество пар чисел отстоящих друг от друга не менее...

Как написать данную программу на c++?
Сколько не пытался, ничего не выходит.

1
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
12.05.2019, 15:17 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
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
#include <iostream>
#include <set>
 
namespace
{
    // изначально первая нерешенная задача имеет номер 1
    int currentActualProblem = 1;
 
    // множество решенных задач, изначально пустое
    std::set<int> solvedProblems;
 
    // множество актуальных задач, изначально пустое
    std::set<int> actualProblems;
 
    // найти следующую актуальную задачу
    void updateCurrentActualProblem()
    {
        // среди всех решенных задач найти задачу с минимальным номером, 
        // но большим чем только что решенная актульаная задача
        auto nextSolved = solvedProblems.upper_bound(currentActualProblem);
 
        // пока такая задача есть и она не следующая после только что решенной актуальной,
        // идем вперед по множеству, увеличивая и номер актуальной задачи
        while (nextSolved != solvedProblems.end() && *nextSolved == currentActualProblem + 1)
        {
            ++nextSolved;
            ++currentActualProblem;
        }
 
        // ну и добавить 1 к актуальной задаче, это будет следующая актуальная задача
        ++currentActualProblem;
    }
 
    // обработать новую решенную задачу
    void processSolvedProblem(const int problem)
    {
        // добавить ко множеству решенных задач
        solvedProblems.insert(problem);
 
        // если это была актуальная задача
        if (problem == currentActualProblem)
        {
            // добавить ко множеству актуальных задач
            actualProblems.insert(problem);
 
            // найти следующую актуальную задачу
            updateCurrentActualProblem();
        }
    }
}
 
int main()
{
    int numberOfProblems = 0;
    std::cin >> numberOfProblems;
 
    for (int i = 0; i < numberOfProblems; ++i)
    {
        int currentProblem = 0;
        std::cin >> currentProblem;
        processSolvedProblem(currentProblem);
    }
 
    for (const auto& actualProblem : actualProblems)
    {
        std::cout << actualProblem << ' ';
    }
    std::cout << std::endl;
    
    return 0;
}
0
12.05.2019, 15:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2019, 15:17
Помогаю со студенческими работами здесь

как написать данную программу?
как записать в каждый пятый элемент массива значения предыдущего байта на процессоре intel 8051H??

Как написать данную программу на С++?
Ввести с клавиатуры целое число S – сумму денег (от 1 до 100). Рассчитать и напечатать минимальное...

как написать данную программу через функцию?
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; main() { int i,a=0; float...

Как написать данную программу через функцию?
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; main() { int i,a=0; float...


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

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

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