#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

 

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章