Cod sursa(job #1710630)

Utilizator retrogradLucian Bicsi retrograd Data 29 mai 2016 14:42:11
Problema Sate2 Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 2.16 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';}

/*************************************************************/

#include <bits/stdc++.h>

using namespace std;
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);
	}
};
multiset<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 getMin() {
	int ret = 0;
	for(int i = 1; i < k; ++i)
		if(Total[ret] > Total[i])
			ret = i;
	return ret;
}

int getMax() {
	int ret = 0;
	for(int i = 1; i < k; ++i)
		if(Total[ret] < Total[i])
			ret = i;
	return ret;
}

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 = getMin();
			Insert(i, bi);
		}


		int step = 0;
		while(true) {
			

			if(++step >= 500000) {
				fout << "NU\n";
				break;
			}

			int bi = getMin();
			int bj = getMax();

			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***********************~
\*************************************************************/