先聲明一個函數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; }