1. 程式人生 > >貓貓的小魚

貓貓的小魚

fin 包含 string 獲得 clu div turn 依次 能夠

貓貓的小魚
catfish
內存限制: 64M
貓貓是叢林裏很多動物心中的天使,她為此十分自豪。貓貓最愛
吃魚了,她每天都要去池塘釣魚吃。貓貓經常吃魚腦,數學特別強,
然而,小女生的性格決定了她的貪玩。
一天,貓貓釣到了很多條魚。她並不想馬上就把可憐的魚兒吃掉,
而是先折磨夠之後再吃(有句話叫什麽來著~最毒不過貓貓心)。
貓貓將這很多很多(數不過來)條魚按照外觀的漂亮程度排序,
每個魚的編號依次為 1、 2、 3……N,第 i 條魚的美觀程度為 3^(i-1)。
貓貓要把這些魚放到桶裏去。她每次拿的魚的數目是任意的。中
的魚的“總美觀程度”為各條魚美觀程度之和。例如:貓貓這一次拿了
第一條魚和第三條魚,那麽美觀程度為 1+9=10。
貓貓想知道,她可以獲得的第 k 大的“總美觀程度”是多少。
從文件中讀入 k,輸出貓貓能夠獲得的,第 k 大的“總美觀程度”。
輸入數據:
數據包含 n+1 行,第一行讀入 n(n≤100)。以下 n 行每行包含一
個 k。
輸出數據:
輸出包含 n 行,每行輸出一個對應的結果。
輸入樣例:
17
輸出樣例:
13
樣例說明:
貓貓能夠拿到的美觀程度從小到大為 1、 3、 4、 9、 10、 12、 13……
所以第 7 大的美觀程度是 13。
對於 50%的輸入文件,有 k≤5000。
對於 100%的輸入文件,有 k≤2^31-1。

題解:
將1、 3、 4、 9、 10、 12、 13轉化成三進制
1 10 11 100 101 110 111 把它們當成二進制再轉成10進制就是
1 2 3 4 5 6 7
所以逆著做一遍就可以了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<map>
 7 #include<set>
 8 #include<cmath>
 9
#include<ctime> 10 #define inf 2147483647 11 #define p(a) putchar(a) 12 #define g() getchar() 13 #define For(i,a,b) for(register long long i=a;i<=b;i++) 14 //by war 15 //2017.10.24 16 using namespace std; 17 long long t; 18 long long k; 19 char a[10000010]; 20 long long cnt; 21 long long P[10000010]; 22 long long
ans; 23 void in(long long &x) 24 { 25 long long y=1; 26 char c=g();x=0; 27 while(c<0||c>9) 28 { 29 if(c==-) 30 y=-1; 31 c=g(); 32 } 33 while(c>=0&&c<=9)x=x*10+c-0,c=g(); 34 x*=y; 35 } 36 void o(long long x) 37 { 38 if(x<0) 39 { 40 p(-); 41 x=-x; 42 } 43 if(x>9)o(x/10); 44 p(x%10+0); 45 } 46 int main() 47 { 48 freopen("catfish.in","r",stdin); 49 freopen("catfish.out","w",stdout); 50 in(t); 51 P[0]=1; 52 For(i,1,30) 53 P[i]=P[i-1]*3; 54 while(t--) 55 { 56 in(k); 57 while(k>0) 58 { 59 ans+=(k%2)*P[cnt++]; 60 k>>=1; 61 } 62 o(ans),p(\n); 63 } 64 return 0; 65 }

貓貓的小魚