Cod sursa(job #299761)

Utilizator luckBogdan Luca luck Data 6 aprilie 2009 23:04:15
Problema Economie Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cmpl(const void *a, const void *b) {
    long d;
    d = *((long*)a) - *((long*)b);
    if(d < 0)
        return -1;
    if(d > 0)
        return 1;
    return 0;
}


int main() {
    int n, i, sc, j, k;
    char *p;
    long *v;
    long *s;
    FILE *f;
    f = fopen("economie.in", "r");
    fscanf(f, "%d", &n);
    v = (long*)malloc(n * sizeof(long));
    s = (long*)malloc(n * sizeof(long));
    for(i = 0; i < n; i++)
        fscanf(f, "%ld", &v[i]);
    fclose(f);
    qsort(v, n, sizeof(long), cmpl);
    for(i = 0; i < n; i++)
        printf("%ld ", v[i]);
    printf("\n");
    p = (char*)malloc(v[n - 1] * sizeof(char));
    bzero(p, v[n - 1] * sizeof(char));
    i = sc = 0;
    j = v[0];
    while(i < n) {
        for(k = 0; k < sc; k++)
            if(p[j - s[k]] == 1) {
                p[j] = 1;
                break;
            }
        if(v[i] == j) {
            if(p[j] == 0) {
                s[sc++] = j;
                p[j] = 1;
            }
            while(v[++i] == j && i < n);
        }
        j++;
    }
    f = fopen("economie.out", "w");
    fprintf(f, "%d\n", sc);
    for(i = 0; i < sc; i++)
        fprintf(f, "%ld\n", s[i]);
    fclose(f);
    free(p);
    free(s);
    free(v);
    return 0;
}