猫猫的小鱼

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

 

posted @ 2017-10-24 11:44  WeiAR  阅读(450)  评论(0编辑  收藏  举报