Pagini recente » Cod sursa (job #688653) | Cod sursa (job #3001310) | Cod sursa (job #595378) | Cod sursa (job #1124286) | Cod sursa (job #1710186)
#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;
}