#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;
}
#96

 

  

posted @ 2020-08-17 22:54  zzuqy  阅读(182)  评论(0编辑  收藏  举报