Cod sursa(job #1710186)

Utilizator PlayHPPet Rescue PlayHP Data 28 mai 2016 17:12:18
Problema Sate2 Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.51 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define MAXN 3000
int v[4][MAXN+1], sum[4], k;
inline int findMax(){
    int i, r=0;
    for(i=1; i<k; i++){
        if(sum[i]>sum[r]){
            r=i;
        }
    }
    return r;
}
inline void swap(int p, int a, int b){
    int aux=v[p][a];
    v[p][a]=v[p][b];
    v[p][b]=aux;
}
int main(){
    int t, n, m, p, x, ok, e, i, pozMax, pozMin;
    FILE *fin, *fout;
    fin=fopen("sate2.in", "r");
    fout=fopen("sate2.out", "w");
    fscanf(fin, "%d", &t);
    for(; t; t--){
        memset(sum, 0, sizeof sum);
        memset(v, 0, sizeof v);
        fscanf(fin, "%d%d%d", &n, &m, &k);
        for(i=1; i<=n; i++){
            fscanf(fin, "%d", &x);
            p=rand()%k;
            v[p][++v[p][0]]=x;
            sum[p]+=x;
        }
        ok=1000000;
        pozMax=findMax();
        if(m%k!=0) ok=0;
        e=m/k;
        while((ok)&&((sum[pozMax]>e))){
            p=rand()%v[pozMax][0]+1;
            pozMin=rand()%k;
            if(pozMin!=pozMax){
                ok--;
                swap(pozMax, p, v[pozMax][0]);
                v[pozMin][++v[pozMin][0]]=v[pozMax][v[pozMax][0]];
                sum[pozMin]+=v[pozMax][v[pozMax][0]];
                sum[pozMax]-=v[pozMax][v[pozMax][0]];
                v[pozMax][0]--;
            }
            pozMax=findMax();
        }
        if(ok) fprintf(fout, "DA\n");
        else fprintf(fout, "NU\n");
    }
    fclose(fin);
    fclose(fout);
    return 0;
}