Pagini recente » Cod sursa (job #1304031) | Cod sursa (job #2198253) | Cod sursa (job #2105408) | Cod sursa (job #391087) | Cod sursa (job #1415995)
#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) {
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 < n3 && j > -1) {
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 () {
freopen ("loto.out","w",stdout);
freopen ("loto.in","r",stdin);
header_data h = readHeader();
int n = h.n;
int s = h.s;
int v[n];
readNumbers(v, n);
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;
}