题意:有n个砝码,每个重量为3^(i-1)。有一个重为w的奖牌。问是否能用这n个砝码称出
奖牌的重量。(可以不全用上)
算法:
由于所有的砝码都是3的次幂。都是三进制为1时对应的重量。
所以将奖牌重量按三进制分解后,必须要是各位为1,才能称重。
如果出现2,就模拟三进制进位运算,前一位加1,将当前的这个位对应的重量放在左边。
(因为 当前的这个位对应的重量 可以表示当前位为1的时候的对应重量。 放在左边,
相当于在奖牌的重量上加了一个重量,三进制运算2+1实现进位)
如果出现1,将当前的这个位对应的重量放在右边。
如果出现0,说明这个砝码不需要。
#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("%d\n",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!\n\n"); continue; } if(g[len]==0 && n<len) { printf("No way!\n\n"); 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("%d\n",l[lsize-1]); } printf("RIGHT:"); if(rsize==0) printf("\n"); else { for(int i=0;i<rsize-1;i++) printf("%d ",r[i]); printf("%d\n",r[rsize-1]); } printf("\n"); } return 0; }
wustoj 1284 Gold Medal (三进制模拟),布布扣,bubuko.com
wustoj 1284 Gold Medal (三进制模拟)
原文:http://blog.csdn.net/u012841845/article/details/22527809