#96.近似排序真的需要结构体么
先声明一个函数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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2019-08-17 123
2018-08-17 p1864
2018-08-17 p1824