Cod sursa(job #1709924)

Utilizator PlayHPPet Rescue PlayHP Data 28 mai 2016 14:26:01
Problema Sate2 Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.92 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define MAXN 3000
#define MAXM 90000
int v[MAXN+1], viz[MAXM+1], n, aux[MAXN+1], rez[MAXN+1];
bool check[MAXN+1];
inline void shuffle(){
    int i, p, aux;
    for(i=1; i<=n; i++){
        p=rand()%i+1;
        aux=v[p];
        v[p]=v[i];
        v[i]=aux;
    }
}
inline bool numerge(int r, int n, int t){
    int s=0, i, j;
    memset(viz, 0, sizeof viz);
    viz[0]=-1;
    i=1;
    while((i<=n)&&(viz[r]==0)){
        s+=v[i];
        if(s>r){
            s=r;
        }
        for(j=s; j>0; j--){
            if((viz[j]==0)&&(viz[j-v[i]])){
                viz[j]=i;
            }
        }
        i++;
    }
    if(viz[r]==0){
        return 1;
    }else if(t==1){
        return 0;
    }else{
        memset(check, 0, sizeof check);
        s=r;
        while(s>0){
            check[viz[s]]=1;
            s-=v[viz[s]];
        }
        int e=0, u=0;
        for(i=1; i<=n; i++){
            if(!check[i]){
                aux[++e]=v[i];
            }else{
                rez[++u]=v[i];
            }
        }
        for(i=1; i<=e; i++){
            v[i]=aux[i];
        }
        for(i=1; i<=u; i++){
            v[i+e]=rez[i];
        }
        return numerge(r, e, t-1);
    }
}
int main(){
    int m, k, i, ok, t;
    FILE *fin, *fout;
    fin=fopen("sate2.in", "r");
    fout=fopen("sate2.out", "w");
    fscanf(fin, "%d", &t);
    for(; t; t--){
        fscanf(fin, "%d%d%d", &n, &m, &k);
        for(i=1; i<=n; i++){
            fscanf(fin, "%d", &v[i]);
        }
        ok=10000;
        if(m%k!=0){
            ok=0;
        }
        while((ok)&&(numerge(m/k, n, k-1))){
            shuffle();
            ok--;
        }
        if(ok){
            fprintf(fout, "DA\n");
        }else{
            fprintf(fout, "NU\n");
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}