猫猫的小鱼
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