翻开刘汝佳的算法竞赛入门经典,看到了很久以前做过的一道题目。用栈模拟火车进站出站。该题在POJ题号为1363,;ZOJ为1259;UVA为514。我没有用栈去做,已经在UVA和ZOJ均AC,但是不晓得POJ为啥过不了。现在把代码贴到下面,等明天清醒了再找漏洞。
#include <stdio.h> int main() { int n; while (scanf("%d", &n) && n) { int tmp, ma, mi; while (scanf("%d", &tmp) && tmp) { ma = mi = tmp; int flag = 1; for (int i=1; i<n; i++) { scanf("%d", &tmp); if (tmp>mi && tmp<ma) { flag = 0; } if (tmp > ma) { ma = tmp; mi = ma; } else mi = mi <= tmp ? mi : tmp; } if (flag) printf("Yes\n"); else printf("No\n"); } printf("\n"); } return 0; }
上面代码有很大的漏洞。首先 3 1 4 2这个数据就过不了。对于这道题,最后我得到的结论是:一列数中,对于每个数,后面比它小的数都应该是降序排列,这样才能满足题目的条件。下面是我经过修改的低效率做法,终于在POJ AC了,依然按照我的那个结论。
#include <stdio.h> int main() { int n; while (scanf("%d", &n) && n) { int tmp[1005], ma, mi; while (scanf("%d", &tmp[0]) && tmp[0]) { int flag = 1; for (int i=1; i<n; i++) { scanf("%d", &tmp[i]); } for (int i=0; i<n; i++) { ma = mi = tmp[i]; for (int j=i+1; j<n; j++) { if (tmp[j]>mi && tmp[j]<ma) { flag = 0; } else mi = mi <= tmp[j] ? mi : tmp[j]; } if (!flag) break; } if (flag) printf("Yes\n"); else printf("No\n"); } printf("\n"); } return 0; }