#include #include #include #include #define FL __FILE__,__LINE__ #define PD printf("."); fflush(stdout) #define tz(x) if(x){printf("\n%s:%d:5:Fail: %s is %d not zero.",FL,#x,x);}else PD; #define tde(x,y) if(x!=y){printf("\n%s:%d:6:Fail: %s is %d not %d.",FL,#x,x,y);}else PD; #define tse(x,y) if(strcmp(x,y)){printf("\n%s:%d:6:Fail: %s is %s not %s",FL,#x,x,y);}else PD; typedef struct entry_t { int value; int used; struct entry_t *next; } entry; entry *heada=NULL; entry *headb=NULL; void append(int value, entry **tail) { if (tail == NULL) { return; } if (*tail == NULL) { *tail = calloc(sizeof(entry),1); (*tail)->value = value; (*tail)->used = 0; }else append(value, &(*tail)->next); } void print_list(entry *head) { entry *current = head; while (current != NULL) { if( current -> used == 0) printf("%d ", current->value); else printf("x "); current = current->next; } printf("\n"); } entry *nextunused(entry *head) { entry *current = head; while (current != NULL) { if (current->used == 0) { return current; } current = current->next; } return NULL; } entry *smallestunused(entry *head) { entry *current = head; int largest = INT_MAX; entry *r = NULL; while (current != NULL) { if (current->used == 0) { if (current->value < largest) { largest = current->value; r = current; } } current = current->next; } return r; } int calcpair() { entry *a = smallestunused(heada); entry *b = smallestunused(headb); if (a == NULL || b == NULL) { return 0; } a->used = 1; b->used = 1; return abs(a->value - b->value); } int allpairs() { int sum = 0; while(nextunused(heada) != NULL && nextunused(headb) != NULL) { sum += calcpair(); } return sum; } void readentry(const char *in) { int a,b = 0; if (in == NULL) scanf("%d %d",&a,&b); else sscanf(in,"%d %d",&a,&b); if( a == 0 || b == 0) return; append(a,&heada); append(b,&headb); } void loadtestdata(void){ heada = NULL; headb = NULL; readentry("3 4"); readentry("4 3"); readentry("2 5"); readentry("1 3"); readentry("3 9"); readentry("3 3"); } void loadtestdata2(void){ heada = NULL; headb = NULL; readentry("3 4"); readentry("4 4"); readentry("2 5"); readentry("1 3"); readentry("3 9"); readentry("3 3"); } void test(void){ loadtestdata(); print_list((heada)); print_list((headb)); tde(allpairs(),11); print_list((heada)); print_list((headb)); loadtestdata(); print_list((heada)); print_list((headb)); tde(allpairs(),11); tde(allpairs(),0); loadtestdata2(); tde(allpairs(),12); heada = NULL; headb = NULL; } int main() { test(); while(!feof(stdin)) readentry(NULL); printf("\nAnswer: %d\n",allpairs()); return 0; }