Cod sursa(job #1710436)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 28 mai 2016 22:38:58
Problema Sate2 Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.43 kb
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXN 3000
int v[4][MAXN+1],sum[4],k;
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(){
    freopen("sate2.in","r",stdin);
    freopen("sate2.out","w",stdout);
    int tests,test,n,m,p,x,ok,e,i,pozMax,pozMin;
    scanf("%d",&tests);
    for(test=1;test<=tests;test++){
        memset(sum,0,sizeof(sum));
        memset(v,0,sizeof(v));
        scanf("%d%d%d",&n,&m,&k);
        for(i=1;i<=n;i++){
            scanf("%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)
            printf("DA\n");
        else
            printf("NU\n");
    }
    return 0;
}