Cod sursa(job #2198792)

Utilizator giotoPopescu Ioan gioto Data 25 aprilie 2018 14:41:58
Problema Sate2 Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.61 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;
}