Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
用这方法能过这道题不阴险。但是做了几次才过。主要是细节问题。放代码出来给大家参考下吧。 我的解法是: 逐行处理,从第一行到最后一行都处理一次,中间跳过大片重复的数字。方法很简单。就看你是否注意细节了。 #include <stdio.h> struct element { int val, len; }; struct runlist { struct element ele[1024], *cur; int len, off; }; struct runlist in, data[3], *line[4]; int width; int max(int a, int b) { return a > b ? a : b; } //#define _DBG_ #ifdef _DBG_ void rl_dump(struct runlist *rl) { int i, j; if (!rl->len) { for (i = 0; i < width; i++) printf("--- "); printf("\n"); return; } for (i = 0; i < rl->len; i++) { for (j = 0; j < rl->ele[i].len; j++) printf("%3d ", rl->ele[i].val); } printf("\n"); } #endif void rl_input(struct runlist *rl) { int left; if (in.cur == &in.ele[in.len]) { rl->len = 0; return; } left = width; rl->len = 0; while (left) { rl->ele[rl->len].val = in.cur->val; if (in.cur->len - in.off > left) { rl->ele[rl->len].len = left; rl->len++; in.off += left; left = 0; } else { rl->ele[rl->len].len = in.cur->len - in.off; left -= rl->ele[rl->len].len; rl->len++; in.cur++; in.off = 0; } } return; } int out_val, out_len; void rl_output(int val, int len) { #ifdef _DBG_ printf("output %d %d\n", val, len); #endif if (out_val == val) { out_len += len; return; } if (out_val != -1) printf("%d %d\n", out_val, out_len); out_val = val; out_len = len; } int main() { int i, j, first[3], mid[3], last[3], max_first, max_mid, max_last; freopen("in.txt", "r", stdin); while (1) { scanf("%d", &width); if (!width) break; printf("%d\n", width); in.len = 0; while (1) { scanf("%d%d", &i, &j); if (!i && !j) break; in.ele[in.len].val = i; in.ele[in.len].len = j; in.len++; } in.cur = in.ele; in.off = 0; for (i = 0; i < 3; i++) { line[i] = &data[i]; line[i]->len = 0; } rl_input(line[1]); out_val = -1; out_len = -1; while (1) { int len; if (!line[1]->len) break; rl_input(line[2]); mid[0] = mid[1] = mid[2] = -1; for (i = 0; i < 3; i++) { line[i]->cur = line[i]->ele; line[i]->off = 0; } #ifdef _DBG_ printf("lines\n"); for (i = 0; i < 3; i++) rl_dump(line[i]); #endif while (line[1]->cur - line[1]->ele != line[1]->len) { j = 0; for (i = 1; i < 3; i++) if (!line[j]->len && line[i]->len || line[j]->len && line[i]->len && line[i]->cur->len - line[i]->off < line[j]->cur->len - line[j]->off) j = i; len = line[j]->cur->len - line[j]->off; #ifdef _DBG_ printf("pick %d\n", len); #endif for (i = 0; i < 3; i++) first[i] = mid[i]; for (i = 0; i < 3; i++) { if (!line[i]->len) { mid[i] = -1; continue; } mid[i] = line[i]->cur->val; line[i]->off += len; if (line[i]->off == line[i]->cur->len) { line[i]->cur++; line[i]->off = 0; } } if (line[1]->cur - line[1]->ele != line[1]->len) { for (i = 0; i < 3; i++) last[i] = line[i]->len ? line[i]->cur->val : -1; } else last[0] = last[1] = last[2] = -1; max_first = max_mid = max_last = 0; for (i = 0; i < 3; i++) { if (first[i] != -1) max_first = max(abs(first[i] - mid[1]), max_first); if (mid[i] != -1) max_mid = max(abs(mid[i] - mid[1]), max_mid); if (last[i] != -1) max_last = max(abs(last[i] - mid[1]), max_last); } if (len == width && !max_mid && in.cur->len - in.off >= width && in.cur->val == mid[2]) { i = (in.cur->len - in.off) / width; rl_output(0, width * (i + 1)); in.off += width * i; if (in.cur->len == in.off) { in.cur++; in.off = 0; } break; } if (len == 1) { max_mid = max(max_mid, max_first); max_mid = max(max_mid, max_last); rl_output(max_mid, 1); } else { rl_output(max(max_mid, max_first), 1); if (len > 2) rl_output(max_mid, len - 2); rl_output(max(max_mid, max_last), 1); } } line[3] = line[0]; line[0] = line[1]; line[1] = line[2]; line[2] = line[3]; } printf("%d %d\n0 0\n", out_val, out_len); } printf("0\n"); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator