Cod sursa(job #1710647)

Utilizator retrogradLucian Bicsi retrograd Data 29 mai 2016 15:35:20
Problema Sate2 Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 2.36 kb
/*************************************************************\
~*********************ENJOY THE SILENCE***********************~
\*************************************************************/
 
#include <bits/stdc++.h>
using namespace std;
 
/*******************Debugging defines*************************/
 
#define ok_dump() cerr<<"OK\n"
#define var_dump(x) cerr<<#x": "<<x<<'\n'
#define arr_dump(x, n) {cerr<<#x"[]: ";\
    for(int _=0;_<n;++_) cerr<<x[_]<<" ";cerr<<'\n';}
 
/*************************************************************/

const int MAXN = 5205;
 
int V[MAXN];
 
struct cmp {
    bool operator() (const int &a, const int &b) const {
        return make_pair(V[a], a) < make_pair(V[b], b);
    }
};
set<int, cmp> Set[5];
int Total[5];
int k;
 
void Insert(int val, int to) {
    Set[to].insert(val);
    Total[to] += V[val];
}
 
void Erase(int val, int to) {
    Set[to].erase(val);
    Total[to] -= V[val];
}

int main() {
    ifstream fin("sate2.in");
    ofstream fout("sate2.out");
 
    int t, n, m;
    fin >> t;
 
    while(t--) {
        fin >> n >> m >> k;
 
        bool bad = false;
        for(int i = 1; i <= n; ++i) {
            fin >> V[i];
        }
 
        for(int i = 0; i < k; ++i) {
            Set[i].clear();
            Total[i] = 0;
        }
 
        sort(V + 1, V + n + 1);
         
        if(m % k || V[n] > m / k) {
            fout << "NU\n";
            continue;
        }
 
        for(int i = n; i >= 1; --i) {
            int bi = min_element(Total, Total + k) - Total;
            Insert(i, bi);
        }
 
 
        int step = 0;
        while(true) {
             
 
            if(++step >= 500000) {
                fout << "NU\n";
                break;
            }
 
            int bi = min_element(Total, Total + k) - Total;
            int bj = max_element(Total, Total + k) - Total;
 
            if(Total[bi] == Total[bj]) {
                fout << "DA\n";
                break;
            }
 
            // Torn din bi in bj
            int need = m / k - Total[bi];
            V[0] = rand() % need;
 
            auto it = Set[bi].lower_bound(0);
 
            Insert(*it, bi);
            Erase(*it, bj);
        }
    }
 
 
    return 0;
}
 
/*************************************************************\
~*********************ENJOY THE SILENCE***********************~
\*************************************************************/