本文共 2215 字,大约阅读时间需要 7 分钟。
#include#include #include using namespace std;const int n_max = 2000 + 5;char cow[n_max];char dir[n_max];int n;int main(){ while(~scanf("%d", & n)) { for(int i = 0; i < n; i ++) { getchar(); scanf("%c", & cow[i]); } int pos1 = 0, pos2 = n - 1, pos = 0; while(pos < n) { if(cow[pos1] < cow[pos2]) //如果 cow 的 头部 小于 尾部,直接加入dir { dir[pos] = cow[pos1]; pos1 ++; } else if(cow[pos2] < cow[pos1]) //如果 cow 的 尾部 小于 头部,直接加入dir { dir[pos] = cow[pos2]; pos2 --; } else if(cow[pos1] == cow[pos2]) //如果 cow 的 头部 等于 尾部,需要进一步的判断 { if(pos1 == pos2) //如果是因为pos1 和 pos2 到达同一位置而相等 则直接弹出 { dir[pos] = cow[pos1]; goto End; } int t1 = pos1, t2 = pos2; int flag = 0; do { t1 ++; t2 --; //不断往里查找 看看是从头部出发 先出现小值 还是 从尾部出发 先出现小值 if(cow[t1] < cow[t2]) { dir[pos] = cow[pos1]; pos1 ++; flag = 1; break; } else if(cow[t2] < cow[t1]) { dir[pos] = cow[pos2]; pos2 --; flag = 1; break; } }while(t1 < t2); if(!flag) //查找内部 发现 头部和尾部 后面的顺序全部相同 则头部 尾部随意取其一(这里取了头部 { dir[pos] = cow[pos1]; pos1 ++; } } pos ++; }End: int cnt = 0; for(int i = 0; i < n; i ++) //输出格式 { printf("%c", dir[i]); cnt ++; if(cnt % 80 == 0 || cnt == n) printf("\n"); } }}
:
输入n表示字符串长度。之后输入n个字母。
之后可以进行两种操作: 1:删去cow头部,添加在dir尾部。 2 : 删去cow尾部,添加在dir尾部。 问操作后 输出字典序最小的操作结果。题解:
如上,就是根据过程模拟。
转载地址:http://djtpi.baihongyu.com/