2236: Balance and Poise

2236: Balance and Poise


ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE
5s8192K300133Standard

工匠大师Hill打造出一个精致的天平, 对他的徒弟Oren说:“你帮我做一些砝码配套,为了方便携带,砝码数目要尽量少”。

Oren:“好。我将按照2进制的规则打造,也就是1,2,4,8,16等等,这样在称量同等重量下使用的砝码数量最少,只使用7个砝码就可以称量1-127的重量。”
Hill:“No, you are wrong”。
Oren:“难道还有更好的方法?2进制是最优的,这一点是可以证明的”
Hill:“如果只允许砝码放在天平的一端,那么你说的是对的,可是并没有人限制我们可以在天平的两端放置砝码。所以可以有更好的方法。如可以设计砝码重量为1,3,9,27,81,只用5个砝码就可以称量1-121”。
Oren:“原来是3进制,那怎么称重呢? 如100克重量?”
Hill:“在天平的左端放上重物,再放上砝码9,右端放砝码1, 27, 81”。
Oren:“嗯,可这是怎么算出来的呢?”
Hill:“It’s your business”。
现在,作为Oren的朋友,请你设计一个程序来计算在这种砝码下应如何称量。

Input:

输入包括多个整数,每个数n占据一行,代表要称重的重量。0 < n <= 1000000000。

Output:

对于每个输入的整数,计算当此重量放置在天平左端时,应如何安排3进制的砝码,使天平平衡。每个结果输出一行,输出格式如例子所示,每个数字后面一个空格,如某一侧没有砝码,则输出0,多个砝码按重量升序排列。

Sample Input:

100
30

Sample Output:

9 left, 1 27 81 right.
0 left, 3 27 right.

 

Problem Source: skywind

#include<iostream>
using namespace std;
int main()
{
    int n;//如果N%3==1 在N-1的基础上在右面加权d;如果N%3==2,则在N+1的基础上在左面加权d;
    //如果N%3==0,则权d*3,N/=3;
    int left[30],right[30];
    while(cin>>n)
    {
        int d=1,l=0,r=0;
        while(n)
        {
            while(n%3==0) n/=3,d*=3;
            if(n%3==1)right[r++]=d,n--;
            else if(n%3==2)  left[l++]=d,n++;
        }
        if(l==0) cout<<"0 left, ";
        else{for(int i=0;i<l;i++) cout<<left[i]<<" ";cout<<"left, ";}
        for(int i=0;i<r;i++) cout<<right[i]<<" ";cout<<"right."<<endl;
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值