Cod sursa(job #1415997)

Utilizator alin.emanuelAlin Emanuel alin.emanuel Data 7 aprilie 2015 02:07:05
Problema Loto Scor 25
Compilator c Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <stdio.h>
#include <stdlib.h>

typedef struct header_data {
    int n;
    int s;
} header_data;

typedef struct three_sum {
    int v[3];
    int sum;
} three_sum;

header_data readHeader () {
    header_data h;
    scanf("%d %d", &(h.n), &(h.s));
    return h;
}

void readNumbers (int* v, int n, FILE* in) {
    int i;
    for (i = 0; i < n; i++) {
        scanf("%d ", &v[i]);
    }
}

void setThreeSums (int* v, int n, three_sum* threeSumsVect) {
    int i, j, k, m = 0;
    three_sum t;
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            for (k = 0; k < n; k++) {
                t.v[0] = v[i];
                t.v[1] = v[j];
                t.v[2] = v[k];
                t.sum = v[i] + v[j] + v[k];
                threeSumsVect[m++] = t;
            }
        }
    }
}

int setTheSixNumbers (three_sum* threeSumsVect, int n, int desiredSum, int* result) {
    int n3 = n * n * n;
    int i = 0, j = n3 - 1;
    while (i <= j) {
        three_sum left = threeSumsVect[i];
        three_sum right = threeSumsVect[j];
        if (left.sum + right.sum == desiredSum) {
            result[0] = left.v[0];
            result[1] = left.v[1];
            result[2] = left.v[2];
            result[3] = right.v[0];
            result[4] = right.v[1];
            result[5] = right.v[2];
            return 1;
        }
        if (left.sum + right.sum < desiredSum) {
            i++;
        }
        else {
            j--;
        }
    }
    return 0;
}

int printResult (int* result, int exists) {
    if (exists) {
        int i;
        for (i = 0; i < 6; i++) {
            printf("%d ", result[i]);
        }
    }
    else {
        printf("%d", -1);
    }
}

int cmpfunc (const void * a, const void * b) {
   return ( (*(three_sum*)a).sum - (*(three_sum*)b).sum );
}

int main () {

    FILE *out = freopen ("loto.out","w",stdout);
    FILE *in = freopen ("loto.in","r",stdin);

    header_data h = readHeader();
    int n = h.n;
    int s = h.s;

    int v[n];
    readNumbers(v, n, in);

    three_sum threeSumVect[n * n * n];
    setThreeSums(v, n, threeSumVect);

    qsort(threeSumVect, n * n * n, sizeof(three_sum), cmpfunc);

    int result[6];
    int exists = setTheSixNumbers(threeSumVect, n, s, result);

    printResult(result, exists);

    return 0;

}