Cod sursa(job #2786100)

Utilizator RamanujanNeacsu Mihnea Ramanujan Data 20 octombrie 2021 11:25:22
Problema Sate2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.73 kb
#include <bits/stdc++.h>
#define MAXK 6
#define INF 100000000
using namespace std;
vector< int > a[MAXK];
int sums[MAXK];//aici pun sumele din fiecare heap
ifstream fin("sate2.in");
ofstream fout("sate2.out");
const int luck=1e6;
bool checkSums(int n, int neededSum){
    for(int i=0; i<n; i++){
        if(sums[i]!=neededSum)
            return false;
    }
    return true;
}
int main()
{
    srand(time(NULL));
    int t, m, n, k;
    fin>>t;
    for(int evan=0; evan<t; evan++){
        fin>>n>>m>>k;
        for(int i=0; i<n; i++){
            int temp; fin>>temp;
            int insertSpot=rand()%(k);
            a[insertSpot].push_back(temp);
            sums[insertSpot]+=temp;//tinem sumele
        }
        int tries=0;
        while(tries<luck&&!checkSums(k, m/k)){//facem nspe milioane de incercari
            int minVal=INF, maxVal=0, minPos=0, maxPos=0;
            for(int i=0; i<k; i++){
                if(sums[i]<minVal)
                  minVal=sums[i], minPos=i;
                if(sums[i]>maxVal)//gasim minimul si
                  maxVal=sums[i], maxPos=i;
            }
            int swapMax=rand()%a[maxPos].size();
            sums[minPos]+=a[maxPos][swapMax];
            sums[maxPos]-=a[maxPos][swapMax];//o sa-l sterg pe baiatul asta, e lent al naibii, da'nu vad altfel
            a[minPos].push_back(a[maxPos][swapMax]);//adaug noul element
            a[maxPos].erase(a[maxPos].begin()+swapMax);//si ulterior sterg
            tries++;//sa nu uit sa incrementez
        }
        if(tries==luck)
            fout<<"NU\n";
        else
            fout<<"DA\n";
        //ofc, trebuie resetati si vectorii
        for(int i=0; i<k; i++)
           a[i].clear();
    }
    return 0;
}