先声明一个函数int rev(int x)返回x翻转后的数.
在回家的路上想到了是不是可以直接读入l,r,对于中间的每个数i,把rev(i)存进数组中,对数组排序,从小到大输出rev(a[i]),多快,还省事.用啥结构体啊还要写mycmp,给树神在QQ上说了说.
过了几个红绿灯,我突然想到了样例22,39中的30,rev后得到了3,3再rev是得不到30的,那就写不成了,于是很难过.决定把自己的转变写成博客,名字都想好了,叫做"论#96.近似排序要用结构体的必然性".
然后又和树神讨论了一会,刚开始他认为可以我认为不行,最后他认为不行我认为可以,因为我想到了可以排序后把a[i]rev后再多次*10直到到达[l,r]内,那这样就可以应对大多数情况(也就是把第二个while删掉也能过)(提交编号#17993).
探究一下题目中的英文可知,应该按照转换后的数字为第一关键字,转换前的数字为第二关键字,都从小到大排.我想到了一个很特殊的情况,l=1,r=100时会先输出1 10 100,可以用一个while把'1'rev后多乘几次10(提交编号#17966),而大多数人包括刘老师写的都没有考虑第二关键字,用1 100可以轻松卡掉他们,因为他们前三个会输出1 100 10(sort真给面子).
这样就成功得到了一份不用结构体的AC代码.
int l, r; int rev(int x) { int a = 0; while (x) { a = a * 10 + x % 10; x = x / 10; } return a; } int a[110]; int main() { cin >> l >> r; for (int i = l; i <= r; i++) a[i - l + 1] = rev(i); sort(a + 1, a + 2 + r - l); for (int i = 1; i <= r - l + 1; i++) { int t = rev(a[i]); while (t < l) t = t * 10; cout << t << endl; while (i < r - l + 1 && a[i] == a[i + 1]) { i++; t = t * 10; cout << t << endl; } } return 0; }