С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Leinstay
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 13
#1

Средства для уменьшения выделения памяти - C++

12.06.2013, 03:30. Просмотров 713. Ответов 10
Метки нет (Все метки)

Светофор, установленный на повороте в торговый центр «МЕГА» с Новомосковского тракта, работает в таком режиме, что за одну минуту повернуть успевают k машин. По выходным, когда жители города едут закупаться продуктами и одеждой, перед этим поворотом вырастает огромная пробка. Администрация торгового центра дала указание повесить под строящимся неподалёку мостом камеру, подсчитывающую количество автомобилей, подъезжающих к этому повороту со стороны города. По информации, полученной с камеры за n минут, прошедших с начала наблюдений, определите количество машин, стоящих в пробке в настоящий момент времени.
Исходные данные
В первой строке записаны целые числа k и n (1 ≤ k, n ≤ 100) — количество машин, успевающих повернуть на «МЕГУ» в течение минуты, и количество минут, прошедших с начала наблюдений. Во второй строке через пробел записаны целые числа a1, …, an (0 ≤ ai ≤ 100), где ai — количество машин, подъехавших к повороту со стороны города в течение i-й минуты. Можно считать, что наблюдения начинаются рано утром, когда машин, ожидающих на повороте, ещё нет.
Результат
Выведите количество машин, стоящих в пробке на повороте через n минут после начала наблюдений.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once
#include <iostream>
using namespace std;
 
int main ()
{
    short int k, n, i;
    short int Mas[101];
    cin >> n >> k;
    for (i = 0; i < k; i++)
        cin >> Mas[i];
    for (i = 0; i < k; i++)
        if ((Mas[i]-n) > 0)
            Mas[i+1] = Mas[i+1] + (Mas[i]-n);
        else 
            Mas[i+1] = Mas[i+1];
    if ((Mas[k-1] - n) > 0)
        cout << (Mas[k-1] - n) << endl;
    else 
        cout << 0 << endl;
}
Для моей программы выделено 192 КБ памяти, кому то с сайта с которого я брал задачу удалось уложиться в 104 КБ, что для этого нужно использовать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2013, 03:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Средства для уменьшения выделения памяти (C++):

Ошибка выделения памяти для двумерного массива - C++
void create(int **Matrix, int n, int m) { Matrix=new int*; for(int i=0; i&lt;n; i++) Matrix = new int; for(int i=0; i&lt;n;...

Какие существуют способы выделения памяти для переменных? - C++
А какие существуют способы выделять память для переменных?

Передача массива указателей в функцию для выделения памяти - C++
Есть функция, в которую передаются массивы указателей, для выделения памяти. void str_malloc(char** &amp;strBol,char** &amp;strUvr,char**...

Как написать программу для динамического выделения памяти с использованием new - C++
Надо написать прогу, которая выделяет память для структур размером в 2048 байт и обрабатывает ситуацию в случае ее нехватки. Я понятия не...

Изменить способ выделения памяти для массива (вместо new использовать malloc) - C++
#include &quot;stdafx.h&quot; #include &quot;stdlib.h&quot; struct str_Team{ char Komanda; int Ochki; int Gold; int Silver; int...

Написать инструкцию выделения памяти для одного экземпляра заданного класса (динамическая память) - C++
Дан класс и указатель: class X{ int a; public: X(int _a) {a = _a;} }; X *p; Напишите инструкцию выделения памяти для...

10
UnsKneD
алкокодер
155 / 151 / 12
Регистрация: 27.12.2012
Сообщений: 550
12.06.2013, 05:29 #2
Цитата Сообщение от Leinstay Посмотреть сообщение
Для моей программы выделено 192 КБ памяти
Каким образом данные сняли?

Добавлено через 1 час 10 минут
Leinstay, для начала cin, cout замени на scanf, printf.
C++
1
2
        else 
            Mas[i+1] = Mas[i+1];
это вообще лишнее.
0
Leinstay
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 13
12.06.2013, 15:05  [ТС] #3
Цитата Сообщение от UnsKneD Посмотреть сообщение
Каким образом данные сняли?

Добавлено через 1 час 10 минут
Leinstay, для начала cin, cout замени на scanf, printf.
C++
1
2
        else 
            Mas[i+1] = Mas[i+1];
это вообще лишнее.
Эта строчка заменяется на ; но к сожалению объем выделенной памяти это не уменьшит.
Данные по скорости работы и объему памяти выставляет сам сайт после онлайн проверки на большом количестве тестов.
И разве ваши операторы не относятся к языку си? В чем их преимущество? Я просто думал что для моих целей нужно использовать динамическую память и указатели, но я не знаю где и как
0
UnsKneD
алкокодер
155 / 151 / 12
Регистрация: 27.12.2012
Сообщений: 550
12.06.2013, 15:13 #4
Leinstay, хоть относится и к си, но памяти требует меньше. Указатели могут потреблять больше памяти. А вот насчёт динамической памяти, http://ru.wikipedia.org/wiki/New_%28C%2B%2B%29

Что бы реально снизить размер занимаемой памяти, лучше будет использовать классы.
1
Thinker
Эксперт С++
4229 / 2203 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.06.2013, 15:36 #5
В этой задаче массив не нужен (вот и экономия памяти):
C++
1
2
3
4
5
6
7
    rez = 0;
    for (i = 0; i < n; i++)
    {
       cin >> a;
       rez = (a + rez - k > 0) ? (a + rez - k) : 0;
    }
    cout << rez << endl;
1
Leinstay
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 13
12.06.2013, 23:29  [ТС] #6
Цитата Сообщение от UnsKneD Посмотреть сообщение
Что бы реально снизить размер занимаемой памяти, лучше будет использовать классы.
Тогда другой вопрос, где и как здесь использовать классы, дело в том что я на практике их еще не задействовал т.к. не понимаю где и когда их нужно использовать =\

Цитата Сообщение от UnsKneD Посмотреть сообщение
Для начала cin, cout замени на scanf, printf.
Я для пробы заменил все как вы сказали, результат увеличение до 216 KB

Цитата Сообщение от Thinker Посмотреть сообщение
В этой задаче массив не нужен (вот и экономия памяти):
Хоть твое решение мне очень понравилось, и думаю оно намного логичнее моего, но судя по сайту время выполнения и объем памяти выделенной такой же как у меня. Я так понял память выделяется во время использования программы и чтобы уменьшить выделенный объем необходимо в каком то месте очистить уже неиспользованный участок, а сама модернизация программы уменьшит только её вес.

Собственно сам сайт http://acm.timus.ru, задача 1787, может захотите посмотреть откуда и почему берутся такие цифры, JUDGE_ID: 145475XX

Добавлено через 1 час 7 минут
В общем насколько из этого всего я понял 192 КБ получилось из за:
C++
1
2
    short int k, n, i;
    short int Mas[101];
И единственный способ решить эту проблему это использовать битовые поля, можете объяснить как это сделать? =\
0
UnsKneD
алкокодер
155 / 151 / 12
Регистрация: 27.12.2012
Сообщений: 550
13.06.2013, 02:41 #7
Цитата Сообщение от Leinstay Посмотреть сообщение
Я для пробы заменил все как вы сказали, результат увеличение до 216 KB
а у меня снизилось, вообще такая штука как выделение памяти зависит от ОС
Цитата Сообщение от Leinstay Посмотреть сообщение
использовать битовые поля
для начала тебе понадобиться структура, оператор struct
и битовые поля.
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
13.06.2013, 03:51 #8
Leinstay,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <cstdio>
int main()
{
    short k, n;
    scanf("%d", &k);
    scanf("%d", &n);
    int h = 0;
    int a;
    for (short i = 0; i != n; ++i) {
        scanf("%d", &a);
        h += a;
        h -= k;
        if (h < 0) h = 0;
    }
 
    printf("%d", h);
    return 0;
}
1
Миниатюры
Средства для уменьшения выделения памяти  
Leinstay
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 13
13.06.2013, 04:59  [ТС] #9
Цитата Сообщение от Olivеr Посмотреть сообщение
...
Вау, я ничего не понял, но действительно она затрачивает намного меньше памяти, теперь можно спокойно подумать над тем как и почему.
Спасибо Оливер и вам ребята.
0
UnsKneD
алкокодер
155 / 151 / 12
Регистрация: 27.12.2012
Сообщений: 550
13.06.2013, 05:12 #10
Leinstay, похоже, 112КБ самый минимальный размер выделенной памяти для программы на Си, попробовал там задачу A + B, получил такие же данные.
0
Leinstay
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 13
13.06.2013, 13:21  [ТС] #11
Цитата Сообщение от UnsKneD Посмотреть сообщение
Leinstay, похоже, 112КБ самый минимальный размер выделенной памяти для программы на Си, попробовал там задачу A + B, получил такие же данные.
Как и странно есть один человек который в моей задаче обошелся всего навсего 108 кб, при том же компиляторе, и решил он ее на этом сайте первым, поэтому думаю предел тут только наши возможности =)
0
13.06.2013, 13:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2013, 13:21
Привет! Вот еще темы с ответами:

Написать функции для работы с массивом - выделения/освобождения памяти, консольного ввода/вывода - C++
Напишите функции: 1) выделяющую память для массива данных типа float, 2) заполняющую ячейки данными с клавиатуры, 3) выводящую...

Составить программу для выделения D - экстремального подмножества в заданном графе согласно указанному алгоритму его выделения - C++
Задание. Составить программу для выделения D - экстремального подмножества в заданном графе согласно указанному алгоритму его ...

Ошибка выделения памяти - C++
char * host; host = (char*)malloc(wcslen(_host)); // выделяю память memset(host,'\0',wcslen(_host)); // очищаю host = '\0 ';...

Ошибка выделения памяти... - C++
Когда я пытаюсь выделить память двумерному динамическому массиву, возникает ошибка &quot;Microsoft C++ exception: std::bad_alloc at memory...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.