USACO 2007 November Silver Best Cow Line /// oj21653
题目大意:
输入n 接下来n行字母 在队头和队尾中选出较小的放入新的队列
Sample Input
6
A
C
D
B
C
B
Sample Output
ABCBCD
注意相同的情况 先判断内层的大小 输出小的一边
如 BCADCB -> CADCB -> CADC -> ADC -> DC -> D
这题21653和26220和22713无数提交TLE WA 过程完全没毛病 磨了很久发现是输入的问题
一开始吸收一直用 getchar(); 但oj系统是Linux 不需要吸收\r,所以WA
TLE也可能是因为getchar();一直在等待吸收一个字符 导致程序没有结束
而
getchar();
scanf("%c",&ch);
可以用这种方式代替
scanf(" %c",&ch);
即在%c前加一个空格
#include <bits/stdc++.h> using namespace std; char a[2005]; bool judge(int head,int tail) { //printf("\n%c %c\n",a[head],a[tail]); if(head>=tail) return 0; if(a[head]<a[tail]) return 1; else if(a[head]>a[tail]) return 0; else return judge(head+1,tail-1); } int main() { int n; while(~scanf("%d",&n)) { a[0]=0; for(int i=1;i<=n;i++) scanf(" %c",&a[i]); int head=1,tail=n,cnt=0; while(head<=tail) { if(cnt==80) { printf("\n"); cnt=0; } //printf("\n%c%c\n",a[head],a[tail]); if(a[head]<a[tail]) printf("%c",a[head++]); else if(a[tail]<a[head]) printf("%c",a[tail--]); else { if(judge(head+1,tail-1)==1) printf("%c",a[head++]); else printf("%c",a[tail--]); } cnt++; } printf("\n\n"); } return 0; }