Cod sursa(job #2456230)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 13 septembrie 2019 21:10:31
Problema Sate2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.84 kb
#include <fstream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
ifstream f("sate2.in");
ofstream g("sate2.out");
int primes[] = {2, 3, 5, 7, 11, 13};
int N, M, K;
int A[3005];
int Bag[5];
vector <int> People[5];
const int maxIterations = 1000000;
void Read(){
    f >> N >> M >> K;
    for(int i = 1; i <= N; i++){
        f >> A[i];
        int place = rand() % K + 1;
        Bag[place] += A[i];
        People[place].push_back(A[i]);
    }

}

int maxBag(){
    int PMax = 1, Max = Bag[1];
    for(int i = 2; i <= K; i++){
        if(Bag[i] > Max){
            Max = Bag[i];
            PMax = i;
        }
    }
    return PMax;
}

int minBag(){
    int PMin = 1, Min = Bag[1];
    for(int i = 2; i <= K; i++){
        if(Bag[i] < Min){
            Min = Bag[i];
            PMin = i;
        }
    }
    return PMin;
}
void Erase(int pos, int place){
    swap(People[place][pos], People[place][People[place].size() - 1]);
    People[place].pop_back();
}
void Solve(){
    if(M % K != 0){
        g << "NU\n";
        return;
    }
    for(int i = 1; i <= maxIterations; i++){
        int from = maxBag(), to = minBag();
        if(Bag[from] == Bag[to]){
            g << "DA\n";
            return;
        }
        int posFrom = rand() % People[from].size();
        //int posTo = rand() % People[to].size();
        Bag[from] += - People[from][posFrom];
        Bag[to] += People[from][posFrom];
        People[to].push_back(People[from][posFrom]);
        Erase(posFrom, from);
        //Erase(posTo, to);
    }
    g << "NU\n";
}
int main()
{
    int T;
    srand(time(NULL));
    f >> T;
    while(T--){
        Read();
        Solve();
        for(int i = 1; i <= K; i++){
            Bag[i] = 0;
            People[i].clear();
        }
    }
    return 0;
}