Разделить массив на 3 части

Как можно разделить массив на три части так, чтобы сумма чисел в каждом массиве не превышала сумму в остальных (В тех случаях, когда это возможно), при этом размеры массивов могут быть неодинаковыми.


Ответы (1 шт):

Автор решения: Harry

Сумма всех элементов, деленная на 2 - s. Подгонять три части, начиная с самых больших элементов, так, чтобы сумма каждой части была меньше s. Сначала самые большие - пока можно - в одну. Потом остальные - в другую часть. Потом в третью. Оставшуюся мелочь распихивать по всем трем, как получится. Понятно, что не более чем эвристика. Но, похоже, работает - попробуйте этот код:

#include <vector>
#include <string>
#include <iostream>
#include <iomanip>
#include <algorithm>

using namespace std;


bool exper()
{
    vector<int> v,a,b,c;
    int s = 0, sa = 0, sb = 0, sc = 0;
    for(int i = 50 + rand()%100; i-->0; )
    {
        int z = rand()%1000-50;
        s += z;
        v.push_back(z);
    }
    sort(v.begin(),v.end());
    for(auto it = v.rbegin(); it != v.rend(); it++)
    {
        int x = *it;
        if ((sa + x)*2 < s) { a.push_back(x); sa += x; }
        else if ((sb + x)*2 < s) { b.push_back(x); sb += x; }
        else if ((sc + x)*2 < s) { c.push_back(x); sc += x; }
        else return false;
    }
    if (sa < sb+sc && sb < sa+sc && sc < sa+sb) return true;
    return false;
}

int main(int argc, char * argv[])
{
    for(int tot = 0, fail = 0; ;)
    {
        fail += !exper();
        ++tot;
        cout << setw(8) << tot << "   " << fail << '\r';
    }
}
→ Ссылка