Cod sursa(job #2453683)

Utilizator NOSCOPEPROKENDYMACHEAMACUMVREAU NOSCOPEPROKENDY Data 5 septembrie 2019 10:38:53
Problema Sate2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.73 kb

#include <bits/stdc++.h>

using namespace std;



int t, n, m, k;

int a[3005];

int T[4];

set <pair <int, int> > S[4];

inline int wmin(){

    int p = 0;

    for(int i = 1; i < k ; ++i)

        if(T[i] < T[p]) p = i;

    return p;

}

inline int wmax(){

    int p = 0;

    for(int i = 1; i < k ; ++i)

        if(T[i] > T[p]) p = i;

    return p;

}

int main()

{

    freopen("sate2.in", "r", stdin);

    freopen("sate2.out", "w", stdout);

    scanf("%d", &t);

    srand(time(0));

    while(t--){

        memset(T, 0, sizeof(T));

        scanf("%d%d%d", &n, &m, &k);

        for(int i = 1; i <= n ; ++i)

            scanf("%d", &a[i]);

        sort(a + 1, a + n + 1);

        if(n < k || m % k || a[n] > m / k) {printf("NU\n"); continue ;}

        for(int i = 0; i < k ; ++i)

            S[i].clear();

        for(int i = 1; i <= n ; i += k){

            for(int j = i, w = 0; j <= min(i + k - 1, n) ; ++j, ++w)

                S[w].insert({a[j], j}), T[w] += a[j];

        }

        int cr = 0;

        while(1){

            if(cr >= 545345){printf("NU\n"); break ;}

            ++cr;

            int i = wmin();

            int j = wmax();

            int dif = T[j] - T[i];

            if(dif == 0){printf("DA\n"); break ;}

            int x = rand() % (m / k - T[i]) + 1;

            set <pair <int, int> > :: iterator it = S[j].lower_bound({x, 0});

            if(it != S[j].begin() && it->first != x) --it;

            S[i].insert({it->first, it->second});

            T[i] += it->first;

            T[j] -= it->first;

            S[j].erase({it->first, it->second});

        }

    }

    return 0;

}