猫猫的小鱼
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 }
来源:https://www.cnblogs.com/war1111/p/7722771.html