看板 C_and_CPP 關於我們 聯絡資訊
我剛試著寫一下,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
Biboy:真的好精簡! 看了一陣子才看懂! 感謝b大提供的版本!! 05/03 20:20