我習慣能一個一個handle就先handle。
不過這樣coding似乎也沒比較快,而且有點複雜……
sort以後用內建qsort好了 @_@。
一次吃一行資料,
跟已經吃進來的資料做比較:
吃進來的資料,
可能start在某個farmer中,
或end在某個farmer中,
或是被某個farmer包含,
或包含某個farmer。
光吃資料就夠複雜了吧 -.-
之後做sort,就可以輸出最大milk times,
與idle times。
看來一次先吃完所有資料就不會這麼麻煩……
教學文也說這是complete search。
/* ID: mythnc2 LANG: C TASK: milk2 Milking Cows 2011/10/28 14:44:22 */ #include <stdio.h> #define MAXN 5000 #define BEGIN 0 #define END 1 #define SWAP(x, y, t) (t = x, x = y, y = t) void addframer(int (*)[], int *, int *); void maxf(int (*)[], int, int *, int *); void sort(int (*)[], int *); int main (void) { FILE *fin, *fout; int farmer[MAXN][2]; int tmp[2]; int n, number, maxmilk, maxidle; fin = fopen("milk2.in", "r"); fout = fopen("milk2.out", "w"); fscanf(fin, "%d", &n); for (number = 0; n; n--) { fscanf(fin, "%d %d", tmp, tmp + 1); addframer(farmer, tmp, &number); } sort(farmer, &number); maxf(farmer, number, &maxmilk, &maxidle); fprintf(fout, "%d %d\n", maxmilk, maxidle); return 0; } /* adframer: if tmp in farmer, update it, * if not in farmer, add tmp */ void addframer(int (*farmer)[2], int *tmp, int *n) { int i; for (i = 0; i < *n; i++) { /* 0 0 condition */ if (farmer[i][BEGIN] == 0 && farmer[i][END] == 0) continue; /* tmp contain farmer[i] */ if (tmp[BEGIN] < farmer[i][BEGIN] && tmp[END] > farmer[i][END]) { farmer[i][BEGIN] = farmer[i][END] = 0; continue; } /* farmer[i] contains tmp */ else if (farmer[i][BEGIN] <= tmp[BEGIN] && farmer[i][END] >= tmp[END]) return; /* update: farmer[i] contains tmp[BEGIN] */ if (farmer[i][BEGIN] < tmp[BEGIN] && tmp[BEGIN] <= farmer[i][END]) { tmp[BEGIN] = farmer[i][BEGIN]; farmer[i][BEGIN] = farmer[i][END] = 0; /* start from head again */ i = -1; } /* update: farmer[i] contains tmp[END] */ else if (farmer[i][BEGIN] <= tmp[END] && tmp[END] < farmer[i][END]) { tmp[END] = farmer[i][END]; farmer[i][BEGIN] = farmer[i][END] = 0; /* start from head again */ i = -1; } } (*n)++; farmer[i][BEGIN] = tmp[BEGIN]; farmer[i][END] = tmp[END]; } /* maxf: find the maxmilk and maxidle times */ void maxf(int (*farmer)[2], int n, int *milk, int *idle) { int i; if (n == 1) { *milk = farmer[0][END] - farmer[0][BEGIN]; *idle = 0; return; } for (*idle = *milk = i = 0; i < n; i++) { if (*milk < farmer[i][END] - farmer[i][BEGIN]) *milk = farmer[i][END] - farmer[i][BEGIN]; if (i < n - 1 && *idle < farmer[i][BEGIN] - farmer[i + 1][END]) *idle = farmer[i][BEGIN] - farmer[i + 1][END]; } } /* sort: selection sort from high to low does not contain 0 */ void sort(int (*f)[2], int *n) { int i, j, max, tmp; for (i = 0; i < *n - 1; i++) { for (max = j = i; j < *n; j++) if (f[max][BEGIN] < f[j][BEGIN]) max = j; if (max != i) { SWAP(f[max][BEGIN], f[i][BEGIN], tmp); SWAP(f[max][END], f[i][END], tmp); } } /* delete 0 0 */ while (f[*n - 1][BEGIN] == 0 && f[*n - 1][END] == 0) (*n)--; }
沒有留言:
張貼留言