• #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

      

  • 相关阅读:
    Napa简介——基于Web用于Outlook/SharePoint的IDE
    Azul开源Zing Jvm
    如何控制单元测试的粒度?
    存储过程与Entity Framework
    Java增强的for循环和普通for循环对比
    Java中的static变量、方法、代码块初始化执行顺序
    推荐一款好用的博客软件——菊子曰
    Android进程与线程
    OPhone SDK
    开始学习Android
  • 原文地址:https://www.cnblogs.com/qywyt/p/13520688.html
Copyright © 2020-2023  润新知