概述
题意:有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("%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 1284 Gold Medal (三进制模拟)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复