首页 > 其他 > 详细

wustoj 1284 Gold Medal (三进制模拟)

时间:2014-03-30 08:47:12      阅读:496      评论:0      收藏:0      [点我收藏+]

题意:有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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!