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

Стек. Вывести уровень гемоглобина в крови заданного пациента.

15.06.2019, 18:23. Показов 4104. Ответов 13

Студворк — интернет-сервис помощи студентам
На некоторых тестах не правильный ответ. Больше часа не могу понять, где я налажал, возможно в функциях что то не так с типизацией? Код и условие ниже. Заранее благодарен.


Каждый день к Грегори Хаусу приходит много больных, и у каждого измеряется уровень гемоглобина в крови. Данные по всем пациентам заносятся в базу данных.

Но волчанка попадается один раз на миллион, а работать с остальными неинтересно. Чтобы Хаус не выгонял больных, Кадди иногда запрашивает статистику по k последним больным: ей хочется знать сумму их уровня гемоглобина.

Также Хаус — мизантроп: он смотрит уровень гемоглобина больного, который поступил к нему позже всех, и, видя, что это точно не волчанка, выписывает его из больницы и удаляет информацию о нем из базы.

Автоматизацию процесса Хаус поручил Чейзу. Но Чейз почему-то не справился с этой задачей и попросил вас ему помочь.

Входные данные
Первой строкой входного файла задано число n ( 1 ≤ n ≤ 100000 ) — число обращений к базе данных. Запросы к базе выглядят следующим образом: + x ( 1 ≤ x ≤ 10 9 ) — добавить пациента с уровнем гемоглобина x в базу, - — удалить последнего пациента из базы, ? k ( 1 ≤ k ≤ 100000 ) — вывести суммарный гемоглобин последних k пациентов. Гарантируется, что k не превосходит число элементов в базе. Также гарантируется, что запросов на удаление к пустой базе не поступает. Перед началом работы база данных пуста.

Выходные данные
Для каждого запроса " - " вывести уровень гемоглобина в крови пациента, а для каждого запроса " ? k " — суммарный гемоглобин у последних k поступивших пациентов. Ответы выводите в порядке поступления запросов.

Мой код:

C++ (Qt)
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
#include <fstream>      
#include <cstdlib>
#include <iostream>
#include <string>
#include <valarray>
#include <typeinfo>
using namespace std;
 
 
int cnt = 0;
struct stack{               
    int ch;
    stack *next;
};
 
void push(stack* &st, int ch){  
    stack *node = new stack;
    node->ch = ch;
    node->next = st;
    st = node;
}
 
int pop(stack* &st){    
    int res = st->ch;
    stack *temp = st;
    st=st->next;
    delete temp;
    return res;
}
 
int sum_k(stack* &st, int k){   
        stack *temp = st;       
        int res = 0;        
        for(int i = 0; i < k; i++) { 
            res += temp->ch;        
            temp = temp->next;  
        }
        return res;             
}
 
int main(){
    int n;
    int cnt = 0;
    stack *st;  
    ofstream outfile;
    ifstream infile;
    infile.open("input.txt", ios::in);  
    outfile.open("output.txt", ios::out);   
    char string[11];
    if(!infile) return 1;                   
    while(infile>>string){  
        for(int i=1;i<=11;i++){
            if (string[i] == '\0' and string[i] != '?'){
                break;
            }
            cnt += 1;
        }
        int num;
        int num1;
        char * s = new char[cnt];
        for(int i=1;i<=cnt;i++) {
            s[i-1]=string[i];
        }
        if(string[0] == '+'){
            sscanf(s, "%d", &num);
            push(st, num);
            num = 0;
        } 
        if(string[0] == '-') {  
            outfile<<pop(st)<<endl;
        }
        if(string[0] == '?'){
            
            sscanf(s, "%d", &num1); 
            outfile<<sum_k(st, num1)<<endl;
        }
        cnt = 0;
        num = 0;
        num1 = 0;
        delete [] s;
    }
    return 0;
}
Примеры входных данных:

In:
7
+1
+2
+3
?2
-
-
?1
Out:
5
3
2
1
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.06.2019, 18:23
Ответы с готовыми решениями:

Составить алгоритм диагностики анемии по содержанию гемоглобина в крови
Помогите решить пожалуйста: Задание 1 1. Содержания гемоглобина в норме у мужчин (13,8-18,5%). Если гемоглабин больше нормы –...

Записать в стек все заглавные буквы заданного текста и вывести содержимое стека на экран
Записать в стек все заглавные буквы некоторого текста. Вывести стек на экран.

Вывести список пациентов с указанной группой крови
Описать структуру данных. Заполнить с клавиатуры N переменных описанного типа. Осуществить необходимую обработку данных и вывести результат...

13
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.06.2019, 18:41
KeyboardWarrior,
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 <numeric>
 
int main()
{
    int n{};
    std::cin >> n;
 
    std::vector<int> patients;
    while (n--)
    {
        char ch;
        std::cin >> ch;
 
        int val{};
        switch (ch)
        {
        case '+':
            std::cin >> val;
            patients.push_back(val);
            break;
        case '-':
            std::cout << patients.back() << std::endl;
            patients.pop_back();
            break;
        case '?':
            std::cin >> val;
            std::cout << std::accumulate(patients.rbegin(), patients.rbegin() + val, 0) << std::endl;
            break;
        default:
            return -1;
        }
    }
}
0
 Аватар для 7533620
163 / 70 / 39
Регистрация: 28.05.2019
Сообщений: 241
15.06.2019, 18:46
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
int main()
{
    int n;
    cin >> n;
    cin.ignore(1);
    vector<int> val, acc;
    val.reserve(n);
    acc.reserve(n);
    for (int i = 0; i < n; ++i)
    {
        auto c = cin.get();
        if (c == '-')
        {
            cin.ignore(1);
            cout << val.back() << endl;
            val.resize(val.size() - 1);
            acc.resize(acc.size() - 1);
            continue;
        }
        int x;
        cin >> x;
        cin.ignore(1);
        if (c == '+')
        {
            val.push_back(x);
            if (acc.size())
                acc.push_back(acc.back() + x);
            else
                acc.push_back(x);
            continue;
        }
        if (acc.size() != 1)
            cout << acc.back() - acc[acc.size() - 1 - x] << endl;
        else
            cout << acc.back() << endl;
    }
    return 0;
}
0
0 / 0 / 0
Регистрация: 11.06.2019
Сообщений: 28
15.06.2019, 19:09  [ТС]
Благодарю. Только недавно перешёл на C++, не рисковал использовать векторы
0
0 / 0 / 0
Регистрация: 11.06.2019
Сообщений: 28
16.06.2019, 13:17  [ТС]
Здравствуйте. Некоторые тесты не проходят.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
16.06.2019, 15:59
Цитата Сообщение от KeyboardWarrior Посмотреть сообщение
Некоторые тесты не проходят.
Мой вариант разве что по времени может не пройти(об оптимизации не думал), применение дополнительного вектора сумм, как в варианте elseecay, должно решать эту проблему.
0
 Аватар для 7533620
163 / 70 / 39
Регистрация: 28.05.2019
Сообщений: 241
16.06.2019, 18:25
Цитата Сообщение от KeyboardWarrior Посмотреть сообщение
Здравствуйте. Некоторые тесты не проходят.
Там переполнение скорей всего
Цитата Сообщение от KeyboardWarrior Посмотреть сообщение
+ x ( 1 ≤ x ≤ 10 9 )
0
0 / 0 / 0
Регистрация: 11.06.2019
Сообщений: 28
16.06.2019, 18:35  [ТС]
Да. Проблема была в этом, пришлось изменить вектора на long long int и по другому считать сумму. Я уже разобрался
0
1 / 0 / 1
Регистрация: 12.06.2019
Сообщений: 6
18.06.2019, 20:35
Скинь код, пожалуйста
0
0 / 0 / 0
Регистрация: 11.06.2019
Сообщений: 28
18.06.2019, 23:12  [ТС]
Дык единственное, что нужно переделать это вместо accumulate в первом коде сделать свою функцию для суммы. Или кинь ссылку на телегу.
0
1 / 0 / 1
Регистрация: 12.06.2019
Сообщений: 6
18.06.2019, 23:32
KeyboardWarrior, кинул в лс
0
0 / 0 / 0
Регистрация: 03.01.2019
Сообщений: 30
27.06.2019, 21:29
KeyboardWarrior, можете тоже, пожалуйста, код отправить
0
6 / 4 / 1
Регистрация: 28.06.2019
Сообщений: 20
28.06.2019, 18:02
KeyboardWarrior, можете тоже, пожалуйста, код отправить в лс
0
0 / 0 / 0
Регистрация: 30.06.2019
Сообщений: 1
30.06.2019, 16:27
Алекса07, Alex_qd, dfrog, поделитесь тоже программой, пожалуйста!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.06.2019, 16:27
Помогаю со студенческими работами здесь

Заполнить стек 20 случайными числами с интервала [0; -10]. Вывести стек на экран. Изъять из стека каждый четвертый элеме
Заполнить стек 20 случайными числами с интервала . Вывести стек на экран. Изъять из стека каждый четвертый элемент, найти сумму изъятых...

Сформировать стек из 6 цифр. Вывести стек на экран. Удалить элементы из стека, увеличить каждый из них на единицу и снов
Сформировать стек из 6 цифр. Вывести стек на экран. Удалить элементы из стека, увеличить каждый из них на единицу и снова поместить в стек...

Определить уровень комментированности заданного текста
Всем Привет. Помогите пожалуйста с заданием, у меня проблема с кодом. В файле дан исходный текст программы на языке С. Уровнем...

Найти максимальный уровень вложенности заданного списка
Помогите написать программу, которая находит максимальный уровень вложенности заданного списка. Заранее спасибо ^^


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru