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

легкий массив - C++

Восстановить пароль Регистрация
 
so1o
33 / 33 / 2
Регистрация: 16.11.2009
Сообщений: 192
03.05.2010, 19:03     легкий массив #1
Задан массив состоящий из n неотрицательных элементов. Найти в нем индекс элемента, для которого сумма элементов стоящих до него, наименее отличается от суммы элементов, стоящих после него.

я понял алгоритм решения, я это понимаю так:
найти такой индекс, так чтобы разность суммы элементов до и после него, по модулю был наименьшим.
только не могу решить...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
03.05.2010, 20:24     легкий массив #2
алгоритм, по простому:
сделай еще 2 переменнх max и j, в одной как бы найденный индекс в другой разность сумм до и после искомого.
потом проходим по массиву. для каждого элемента вычисляя сумму до и после и сверяем её с max, если она меньше max то запоминаем её в max и текущий индекс запоминаем в j.

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
#include <iostream>
using namespace std;
int main()
{
    srand(time(0));
    int n=5, // количество элементов
    max,     // в этой переменной хранится разность сумм
    j=0,     // индекс искомого элемента
    sumbefor=0, // сумма до текущего
    sumafter=0, // сумма после текущего
    m[n];   // сам массив
    // заполним и распечатаем массив
    for (int i=0;i<n;i++)
    {
        m[i]=rand()%10;
        cout << m[i] << ' ';
    }
    cout << '\n';
 
    // посчитаем сумму после элемента
    for (int i=0;i<n;i++) sumafter+=m[i];
 
    max=abs(sumbefor-sumafter);
    for (int i=0; i<n;i++)
    {
        if (i>0) sumbefor+=m[i-1]; // вычислим сумму до текущего элемента
        sumafter-=m[i];            // высилить мумму после текущего
        if (abs(sumbefor-sumafter) < max)
        {
            max=abs(sumbefor-sumafter);
            j=i;
        }
        // выводим на экран то что у нас в цикле произошло
        cout << "befor=" << sumbefor << " m[" << i << "]=" << m[i] << " after=" << sumafter << " diff is "
             << abs(sumbefor-sumafter) << '\n';
    }
    cout << j; //это индекс того самого элемента
    return 0;
}
Hell Knight
 Аватар для Hell Knight
230 / 84 / 3
Регистрация: 11.03.2010
Сообщений: 290
03.05.2010, 20:43     легкий массив #3
только там плохой рандом)))
его лучше заменить на ручной))

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
#include <iostream>
 
using namespace std;
 
#define MAX 20
 
int sum_right(int * arr)
{
    int g = 0;
    int result = 0;
    while (*(arr + g)!=-1)
    {
        result += *(arr + g);
        g++;
    }
    return result;
}
 
int main()
{
    int a[MAX + 1];
    a[MAX] = -1;
    int eps;
    cout << "Enter pogrehnost: ";
    cin >> eps;
    for (int i = 0; i<MAX; i++)a[i] = rand()%99;
    int sum = NULL;
    for (int i = 0; i<MAX; i++)
    {
        sum += a[i];
        if (abs(sum - sum_right(&a[i])) <= eps)
            cout << "Tot samiy: " << i << "\n";
    }
    system("pause");
    return 0;
}
so1o
33 / 33 / 2
Регистрация: 16.11.2009
Сообщений: 192
04.05.2010, 15:28  [ТС]     легкий массив #4
всем спасибо)) вечером отпишусь о результатах)
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
04.05.2010, 21:40     легкий массив #5
Hell Knight, генератор случайнх чисел не инициализирован, плохо: int sum = NULL; - есть машины с архитектурой, где нулевой узатель это не 0, NULL - нулевой указатель во всех архитектурах, может не быть равным 0. ТУТ: int a[MAX + 1]; a[MAX] = -1; нехорошо делать -1 в качестве терминального символа, такое можно считать издержкой проектирования. sum += a[i]; - так посчитается не мумма элеменов до i-ого, а сумма всех до i-ого и сам i-ый, функция sum_right считает сумму точно так же, вместе с i-ым - не правильно. abs(sum - sum_right(&a[i]) надо нйти элемент для которого соответствующие суммы минимально отличающиеся друг от друга, а не суммы оиличающиеся на пренебрежимо малую величину, так задача не решена. so1o, используй мой вариант.
П.С. Рандом нормальный, только нужна инициализация генератора псевдослучайных чисел текущим временем.
Yandex
Объявления
04.05.2010, 21:40     легкий массив
Ответ Создать тему
Опции темы

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