我是靠谱客的博主 追寻鼠标,这篇文章主要介绍wustoj 1284 Gold Medal (三进制模拟),现在分享给大家,希望可以做个参考。

题意:有n个砝码,每个重量为3^(i-1)。有一个重为w的奖牌。问是否能用这n个砝码称出

奖牌的重量。(可以不全用上)


算法:

由于所有的砝码都是3的次幂。都是三进制为1时对应的重量。


所以将奖牌重量按三进制分解后,必须要是各位为1,才能称重。


如果出现2,就模拟三进制进位运算,前一位加1,将当前的这个位对应的重量放在左边。

(因为 当前的这个位对应的重量 可以表示当前位为1的时候的对应重量。 放在左边,

   相当于在奖牌的重量上加了一个重量,三进制运算2+1实现进位)

如果出现1,将当前的这个位对应的重量放在右边。

如果出现0,说明这个砝码不需要。


复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<cstdlib> #include<map> #include<queue> #include<algorithm> #include<string> #include<vector> using namespace std; int len; int g[35],tri[35]; vector<int> l,r; void fj(int x) { len=0; while(x) { g[len++]=x%3; x/=3; } } int main() { int n,w; tri[0]=1; for(int i=1;i<=31;i++) tri[i]=tri[i-1]*3; while(scanf("%d%d",&n,&w)!=EOF) { memset(g,0,sizeof(g)); l.clear(); r.clear(); fj(w); //for(int i=0;i<len;i++) // printf("%d ",g[i]); //printf("%dn",g[len]); int flag=0; for(int i=0;i<=len;i++) { if(g[i]==1) { r.push_back(tri[i]); } else if(g[i]==2) { l.push_back(tri[i]); g[i+1]++; } else if(g[i]==3) { g[i+1]++; } } if(g[len] && n<len+1) { printf("No way!nn"); continue; } if(g[len]==0 && n<len) { printf("No way!nn"); continue; } int lsize = l.size(),rsize = r.size(); printf("LEFT:"); if(lsize==0) printf("n"); else { for(int i=0;i<lsize-1;i++) printf("%d ",l[i]); printf("%dn",l[lsize-1]); } printf("RIGHT:"); if(rsize==0) printf("n"); else { for(int i=0;i<rsize-1;i++) printf("%d ",r[i]); printf("%dn",r[rsize-1]); } printf("n"); } return 0; }



最后

以上就是追寻鼠标最近收集整理的关于wustoj 1284 Gold Medal (三进制模拟)的全部内容,更多相关wustoj内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部