Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Leinstay
 Аватар для Leinstay
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 13
12.06.2013, 03:30     Средства для уменьшения выделения памяти #1
Светофор, установленный на повороте в торговый центр «МЕГА» с Новомосковского тракта, работает в таком режиме, что за одну минуту повернуть успевают 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 КБ, что для этого нужно использовать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
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];
это вообще лишнее.
Leinstay
 Аватар для 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];
это вообще лишнее.
Эта строчка заменяется на ; но к сожалению объем выделенной памяти это не уменьшит.
Данные по скорости работы и объему памяти выставляет сам сайт после онлайн проверки на большом количестве тестов.
И разве ваши операторы не относятся к языку си? В чем их преимущество? Я просто думал что для моих целей нужно использовать динамическую память и указатели, но я не знаю где и как
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
12.06.2013, 15:13     Средства для уменьшения выделения памяти #4
Leinstay, хоть относится и к си, но памяти требует меньше. Указатели могут потреблять больше памяти. А вот насчёт динамической памяти, http://ru.wikipedia.org/wiki/New_%28C%2B%2B%29

Что бы реально снизить размер занимаемой памяти, лучше будет использовать классы.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 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;
Leinstay
 Аватар для 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];
И единственный способ решить эту проблему это использовать битовые поля, можете объяснить как это сделать? =\
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
13.06.2013, 02:41     Средства для уменьшения выделения памяти #7
Цитата Сообщение от Leinstay Посмотреть сообщение
Я для пробы заменил все как вы сказали, результат увеличение до 216 KB
а у меня снизилось, вообще такая штука как выделение памяти зависит от ОС
Цитата Сообщение от Leinstay Посмотреть сообщение
использовать битовые поля
для начала тебе понадобиться структура, оператор struct
и битовые поля.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
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;
}
Миниатюры
Средства для уменьшения выделения памяти  
Leinstay
 Аватар для Leinstay
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 13
13.06.2013, 04:59  [ТС]     Средства для уменьшения выделения памяти #9
Цитата Сообщение от Olivеr Посмотреть сообщение
...
Вау, я ничего не понял, но действительно она затрачивает намного меньше памяти, теперь можно спокойно подумать над тем как и почему.
Спасибо Оливер и вам ребята.
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
13.06.2013, 05:12     Средства для уменьшения выделения памяти #10
Leinstay, похоже, 112КБ самый минимальный размер выделенной памяти для программы на Си, попробовал там задачу A + B, получил такие же данные.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2013, 13:21     Средства для уменьшения выделения памяти
Еще ссылки по теме:

C++ Передача массива указателей в функцию для выделения памяти
По поводу динамического выделения памяти C++
Как написать программу для динамического выделения памяти с использованием new C++

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

Или воспользуйтесь поиском по форуму:
Leinstay
 Аватар для Leinstay
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 13
13.06.2013, 13:21  [ТС]     Средства для уменьшения выделения памяти #11
Цитата Сообщение от UnsKneD Посмотреть сообщение
Leinstay, похоже, 112КБ самый минимальный размер выделенной памяти для программы на Си, попробовал там задачу A + B, получил такие же данные.
Как и странно есть один человек который в моей задаче обошелся всего навсего 108 кб, при том же компиляторе, и решил он ее на этом сайте первым, поэтому думаю предел тут только наши возможности =)
Yandex
Объявления
13.06.2013, 13:21     Средства для уменьшения выделения памяти
Ответ Создать тему
Опции темы

Текущее время: 17:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru