推 Biboy:真的好精簡! 看了一陣子才看懂! 感謝b大提供的版本!! 05/03 20:20
我剛試著寫一下,rank 19
反轉寫得淺顯易懂,僅供參考。
看convert()就可以了。
#include <stdio.h>
int convert(int T, int A) {
int B = 0, i;
for(i = 0; i < T; ++i) {
B = (B << 1) | (A & 1);
A >>= 1;
}
return B;
}
int main() {
int A, B, C, D, E;
scanf("%d", &A);
while(A--) {
scanf("%d%d", &B, &C);
--B;
E = B;
--C;
D = 1;
while(B--) {
D <<= 1;
}
printf("%d\n", convert(E, C) + D);
}
return 0;
}
※ 引述《Biboy (栗子)》之銘言:
: 首先這是問題的網頁
: http://luckycat.kshs.kh.edu.tw/homework/q679.htm
: 剛開始我是用直觀的方式去寫
: 每一筆輸入就創一個tree去跑
: 然後就被UVA大量的測資弄成TLE...
: 後來有找到使用位元移動方法來寫
: 主要的觀念是將I轉成二位元,然後將高低為原反過來
: 根據這觀念寫出的的code已經AC了 http://pastie.org/3846836
: 雖然知道作法,但還是不太懂要將位元反轉的原理...
: 在找尋說明的時候又發現一個更精簡的code http://pastie.org/3846831
: 但是這個code就真的看不懂了... 尤其是24行為什麼要這要做??
: 雖然寫出來了,但是不懂原理就覺得好像沒有寫出來一樣...
: 有寫過這題的前輩可以解釋一下這題的做法的原理嗎? 謝謝!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.43.126.252