Równa dystrybucja wartości w tablicy

0

Mam problem z poniższym zadaniem:
W pierwszym wierszu danych wejściowych: n - rozmiar tablicy
W drugim n liczb naturalnych oddzielonych spacją - wartości początkowe w poszczególnych komórkach.
Zadaniem programu jest obliczyć ilość "ruchów" potrzebnych do zrównania wszystkich wartości tablicy ze sobą.
Np.
4
2 5 0 1
Prawidłowy wynik to 2, bo wystarczy przenieść "1" z tablicy[1] do tablicy[3] oraz "2" z tablicy[1] do tablicy[2]

Mój kod:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int x, all_to_split = 0, per_one = 0, answer = 0;
    cin >> x;

    int tab[x];

    for (int i=0; i<x; i++){
        cin >> tab[i];
        all_to_split += tab[i];
    }

    per_one = all_to_split/x;

    for (int i=0; i<x; i++){
        if (tab[i] < per_one){
            answer ++;
        }
    }

    cout << answer << endl;

}

Mój pomysł zakładał zliczenie komórek z niedomiarem, ale widzę, że nie działa i nie mam pomysłów.
Będę wdzięczny za pomoc

0

Spróbuj przeanalizować powyższy kod. Nie gwarantuję że jest to algorytm, który znajduje najmniejszą liczbę możliwych kroków.

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

using namespace std;

int calculateMoves( vector<int> data )
{
    auto sum = accumulate( data.cbegin() , data.cend() , 0 );
    if( sum % data.size() != 0 ) return -1;

    auto equalValue = sum/data.size();

    sort( data.begin() , data.end() );

    size_t indexend {data.size()-1};
    size_t indexbegin {0};
    int moves {0};

    while( data[indexend] != data[indexbegin] )
    {
        auto diff1 = data[indexend]-equalValue;
        auto diff2 = equalValue-data[indexbegin];

        if( diff1>diff2 )
        {
            data[indexend] -= diff2;
            data[indexbegin] = equalValue;
            ++indexbegin;
        }
        else
        {
            data[indexend] -= diff1;
            data[indexbegin] += diff1;
            --indexend;
        }

        ++moves;
    }

    return moves;
}

int main()
{
    vector<int> data {45,3,4,483,32,9,10,2,0,0,12,0,50,50,40,60};

    cout << calculateMoves(data) << "\n";

    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1