#include <stdio.h>
#include <stdlib.h>
#define USERNUM 3 // number of rows
#define COLNUM 6 // number of columns
#define ECOLNUM (COLNUM/2) // number of effective columns
struct sum_with_index {
int sum;
int index;
} users[USERNUM], rows[USERNUM][ECOLNUM];
int answer[USERNUM];
int a[USERNUM][COLNUM] =
{{10,20,32,40,45,35},
{20,10,25,42,47,40},
{30,35,15,10,20,25}};
int cmp_sumorder_ascending(const void *v1, const void *v2);
int cmp_sumorder_descending(const void *v1, const void *v2);
void init();
void cal_user_order();
void cal_row_order();
void cal_answer();
void out_answer();
int main() {
int i, j;
// initialize some data structure, users and rows literally
init();
// calculate the order of users
cal_user_order();
/* DEBUG
* for(i = 0; i < USERNUM; i++)
printf("%d\t%d\n", users[i].sum, users[i].index);*/
// calculate the order of each row
cal_row_order();
/* DEBUG
* for(i = 0; i < USERNUM; i++) {
for(j = 0; j < ECOLNUM; j++)
printf("%d,%d\t", rows[i][j].sum, rows[i][j].index);
printf("\n");
}*/
// according to the order of users, iterate each row and calculate the answer
cal_answer();
// print out the answers
out_answer(a, answer);
return 0;
}
int cmp_sumorder_ascending(const void *v1, const void *v2) {
if(((struct sum_with_index const *)v1)->sum > ((struct sum_with_index const *)v2)->sum) return 1;
else if(((struct sum_with_index const *)v1)->sum == ((struct sum_with_index const *)v2)->sum) return 0;
else return -1;
}
int cmp_sumorder_descending(const void *v1, const void *v2) {
if(((struct sum_with_index const *)v1)->sum > ((struct sum_with_index const *)v2)->sum) return -1;
else if(((struct sum_with_index const *)v1)->sum == ((struct sum_with_index const *)v2)->sum) return 0;
else return 1;
}
void init() {
int i, j;
// calculate the sum of each user, and the sum of each pair in each row
for(i = 0; i < USERNUM; i++) {
users[i].sum = 0;
users[i].index = i;
for(j = 0; j < COLNUM; j++) {
users[i].sum += a[i][j];
if(j%2) {
rows[i][(j-1)/2].sum = a[i][j-1] + a[i][j];
rows[i][(j-1)/2].index = (j-1)/2;
}
}
}
}
void cal_user_order() {
qsort(users
, USERNUM
, sizeof(struct sum_with_index
), cmp_sumorder_ascending
); }
void cal_row_order() {
int i;
for(i = 0; i < USERNUM; i++)
qsort(rows
[i
], ECOLNUM
, sizeof(struct sum_with_index
), cmp_sumorder_descending
); }
void cal_answer() {
int chosen[ECOLNUM] = {0};
int i, j;
for(i = 0; i < USERNUM; i++)
for(j = 0; j < ECOLNUM; j++)
if(0 == chosen[rows[users[i].index][j].index]) {
chosen[rows[users[i].index][j].index] = 1;
answer[users[i].index] = rows[users[i].index][j].index;
break;
}
}
void out_answer() {
int i, j;
for(i = 0; i < USERNUM; i++)
printf("User%d: %d %d\n", i
+1, a
[i
][answer
[i
]*2], a
[i
][answer
[i
]*2+1]); }
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgVVNFUk5VTQkzCQkJLy8gbnVtYmVyIG9mIHJvd3MKI2RlZmluZSBDT0xOVU0JNgkJCS8vIG51bWJlciBvZiBjb2x1bW5zCiNkZWZpbmUgRUNPTE5VTQkoQ09MTlVNLzIpCS8vIG51bWJlciBvZiBlZmZlY3RpdmUgY29sdW1ucwoKc3RydWN0IHN1bV93aXRoX2luZGV4IHsKCWludCBzdW07CglpbnQgaW5kZXg7Cn0gdXNlcnNbVVNFUk5VTV0sIHJvd3NbVVNFUk5VTV1bRUNPTE5VTV07CgppbnQgYW5zd2VyW1VTRVJOVU1dOwoKaW50IGFbVVNFUk5VTV1bQ09MTlVNXSA9IAoJe3sxMCwyMCwzMiw0MCw0NSwzNX0sCgkgezIwLDEwLDI1LDQyLDQ3LDQwfSwKCSB7MzAsMzUsMTUsMTAsMjAsMjV9fTsKCmludCBjbXBfc3Vtb3JkZXJfYXNjZW5kaW5nKGNvbnN0IHZvaWQgKnYxLCBjb25zdCB2b2lkICp2Mik7CmludCBjbXBfc3Vtb3JkZXJfZGVzY2VuZGluZyhjb25zdCB2b2lkICp2MSwgY29uc3Qgdm9pZCAqdjIpOwp2b2lkIGluaXQoKTsKdm9pZCBjYWxfdXNlcl9vcmRlcigpOwp2b2lkIGNhbF9yb3dfb3JkZXIoKTsKdm9pZCBjYWxfYW5zd2VyKCk7CnZvaWQgb3V0X2Fuc3dlcigpOwoKaW50IG1haW4oKSB7CglpbnQgaSwgajsKCgkvLyBpbml0aWFsaXplIHNvbWUgZGF0YSBzdHJ1Y3R1cmUsIHVzZXJzIGFuZCByb3dzIGxpdGVyYWxseQoJaW5pdCgpOwoKCS8vIGNhbGN1bGF0ZSB0aGUgb3JkZXIgb2YgdXNlcnMKCWNhbF91c2VyX29yZGVyKCk7CgkvKiBERUJVRwoJICogZm9yKGkgPSAwOyBpIDwgVVNFUk5VTTsgaSsrKQoJCXByaW50ZigiJWRcdCVkXG4iLCB1c2Vyc1tpXS5zdW0sIHVzZXJzW2ldLmluZGV4KTsqLwoKCS8vIGNhbGN1bGF0ZSB0aGUgb3JkZXIgb2YgZWFjaCByb3cKCWNhbF9yb3dfb3JkZXIoKTsKCS8qIERFQlVHCgkgKiBmb3IoaSA9IDA7IGkgPCBVU0VSTlVNOyBpKyspIHsKCQlmb3IoaiA9IDA7IGogPCBFQ09MTlVNOyBqKyspCgkJCXByaW50ZigiJWQsJWRcdCIsIHJvd3NbaV1bal0uc3VtLCByb3dzW2ldW2pdLmluZGV4KTsKCQlwcmludGYoIlxuIik7Cgl9Ki8KCgkvLyBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyIG9mIHVzZXJzLCBpdGVyYXRlIGVhY2ggcm93IGFuZCBjYWxjdWxhdGUgdGhlIGFuc3dlcgoJY2FsX2Fuc3dlcigpOwoKCS8vIHByaW50IG91dCB0aGUgYW5zd2VycwoJb3V0X2Fuc3dlcihhLCBhbnN3ZXIpOwoKCXJldHVybiAwOwp9CgppbnQgY21wX3N1bW9yZGVyX2FzY2VuZGluZyhjb25zdCB2b2lkICp2MSwgY29uc3Qgdm9pZCAqdjIpIHsKCWlmKCgoc3RydWN0IHN1bV93aXRoX2luZGV4IGNvbnN0ICopdjEpLT5zdW0gPiAoKHN0cnVjdCBzdW1fd2l0aF9pbmRleCBjb25zdCAqKXYyKS0+c3VtKSByZXR1cm4gMTsKCWVsc2UgaWYoKChzdHJ1Y3Qgc3VtX3dpdGhfaW5kZXggY29uc3QgKil2MSktPnN1bSA9PSAoKHN0cnVjdCBzdW1fd2l0aF9pbmRleCBjb25zdCAqKXYyKS0+c3VtKSByZXR1cm4gMDsKCWVsc2UgcmV0dXJuIC0xOwp9CgppbnQgY21wX3N1bW9yZGVyX2Rlc2NlbmRpbmcoY29uc3Qgdm9pZCAqdjEsIGNvbnN0IHZvaWQgKnYyKSB7CglpZigoKHN0cnVjdCBzdW1fd2l0aF9pbmRleCBjb25zdCAqKXYxKS0+c3VtID4gKChzdHJ1Y3Qgc3VtX3dpdGhfaW5kZXggY29uc3QgKil2MiktPnN1bSkgcmV0dXJuIC0xOwoJZWxzZSBpZigoKHN0cnVjdCBzdW1fd2l0aF9pbmRleCBjb25zdCAqKXYxKS0+c3VtID09ICgoc3RydWN0IHN1bV93aXRoX2luZGV4IGNvbnN0ICopdjIpLT5zdW0pIHJldHVybiAwOwoJZWxzZSByZXR1cm4gMTsKfQoKdm9pZCBpbml0KCkgewoJaW50IGksIGo7CgkvLyBjYWxjdWxhdGUgdGhlIHN1bSBvZiBlYWNoIHVzZXIsIGFuZCB0aGUgc3VtIG9mIGVhY2ggcGFpciBpbiBlYWNoIHJvdwoJZm9yKGkgPSAwOyBpIDwgVVNFUk5VTTsgaSsrKSB7CgkJdXNlcnNbaV0uc3VtID0gMDsKCQl1c2Vyc1tpXS5pbmRleCA9IGk7CgkJZm9yKGogPSAwOyBqIDwgQ09MTlVNOyBqKyspIHsKCQkJdXNlcnNbaV0uc3VtICs9IGFbaV1bal07CgkJCWlmKGolMikgewoJCQkJcm93c1tpXVsoai0xKS8yXS5zdW0gPSBhW2ldW2otMV0gKyBhW2ldW2pdOwoJCQkJcm93c1tpXVsoai0xKS8yXS5pbmRleCA9IChqLTEpLzI7CgkJCX0KCQl9Cgl9Cn0KCnZvaWQgY2FsX3VzZXJfb3JkZXIoKSB7Cglxc29ydCh1c2VycywgVVNFUk5VTSwgc2l6ZW9mKHN0cnVjdCBzdW1fd2l0aF9pbmRleCksIGNtcF9zdW1vcmRlcl9hc2NlbmRpbmcpOwp9Cgp2b2lkIGNhbF9yb3dfb3JkZXIoKSB7CglpbnQgaTsKCWZvcihpID0gMDsgaSA8IFVTRVJOVU07IGkrKykKCQlxc29ydChyb3dzW2ldLCBFQ09MTlVNLCBzaXplb2Yoc3RydWN0IHN1bV93aXRoX2luZGV4KSwgY21wX3N1bW9yZGVyX2Rlc2NlbmRpbmcpOwp9Cgp2b2lkIGNhbF9hbnN3ZXIoKSB7CglpbnQgY2hvc2VuW0VDT0xOVU1dID0gezB9OwoJaW50IGksIGo7CgoJZm9yKGkgPSAwOyBpIDwgVVNFUk5VTTsgaSsrKQoJCWZvcihqID0gMDsgaiA8IEVDT0xOVU07IGorKykKCQkJaWYoMCA9PSBjaG9zZW5bcm93c1t1c2Vyc1tpXS5pbmRleF1bal0uaW5kZXhdKSB7CgkJCQljaG9zZW5bcm93c1t1c2Vyc1tpXS5pbmRleF1bal0uaW5kZXhdID0gMTsKCQkJCWFuc3dlclt1c2Vyc1tpXS5pbmRleF0gPSByb3dzW3VzZXJzW2ldLmluZGV4XVtqXS5pbmRleDsKCQkJCWJyZWFrOwoJCQl9Cn0KCnZvaWQgb3V0X2Fuc3dlcigpIHsKCWludCBpLCBqOwoJZm9yKGkgPSAwOyBpIDwgVVNFUk5VTTsgaSsrKQoJCXByaW50ZigiVXNlciVkOiAlZCAlZFxuIiwgaSsxLCBhW2ldW2Fuc3dlcltpXSoyXSwgYVtpXVthbnN3ZXJbaV0qMisxXSk7Cn0K