Cod sursa(job #1416065)

Utilizator alin.emanuelAlin Emanuel alin.emanuel Data 7 aprilie 2015 10:58:44
Problema Loto Scor 5
Compilator c Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

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

typedef struct two_sum {
    int v[2];
    int sum;
} two_sum;

header_data readHeader (FILE* in) {
    header_data h;
    fscanf(in, "%d %d", &(h.n), &(h.s));
    return h;
}

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

void setTwoSums (int* v, int n, two_sum* twoSumsVect) {
    int i, j, m = 0;
    two_sum t;
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            t.v[0] = v[i];
            t.v[1] = v[j];
            t.sum = v[i] + v[j];
            twoSumsVect[m++] = t;
        }
    }
}

int setTheSixNumbers (two_sum* twoSumsVect, int n, int desiredSum, int* result) {

    int n2 = n * n;
    int i = 0, j = n2 - 1, k;
    for (k = 0; k < n2; k++) {
        two_sum current = twoSumsVect[k];
        while (i < j) {
            two_sum left = twoSumsVect[i];
            two_sum right = twoSumsVect[j];
            if (left.sum + right.sum + current.sum == desiredSum) {
                result[0] = left.v[0];
                result[1] = left.v[1];
                result[2] = right.v[0];
                result[3] = right.v[1];
                result[4] = current.v[0];
                result[5] = current.v[1];
                return 1;
            }
            if (left.sum + right.sum + current.sum < desiredSum) {
                i++;
            }
            else {
                j--;
            }
        }
    }
    return 0;
}

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

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

int cmpint (const void *a, const void *b) {
    return ( *(int*)a - *(int*)b );
}

int main () {

    FILE *out = fopen ("loto.out","w");
    FILE *in = fopen ("loto.in","r");


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

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

    two_sum* twoSumVect = (two_sum*) malloc(n * n * sizeof(two_sum));
    setTwoSums(v, n, twoSumVect);

    qsort(twoSumVect, n * n, sizeof(two_sum), cmpfunc);

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

    printResult(result, exists, out);

    free(twoSumVect);

    return 0;

}