Eva's Balance

本文介绍了一种使用特定砝码集测量不同重量物体的方法。通过将物体重量转化为三进制数,并根据每位数值的不同来决定如何放置砝码,实现精确测量。提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Eva's Balance
Time Limit: 1000MS		Memory Limit: 10000K
Total Submissions: 4173		Accepted: 2012
Description

Eva has a balance with 20 poises. The weights of the poises are 1, 3, 9, 27,...,3^19. Eva asserts that she has a way to measure any object whose weight is an integer from 1 to (3^20-1)/2. Assuming that Eva has placed an object with the weight in this range on the left tray of the balance, your task is to place the proper poises on the proper trays so as to weigh the object out.
Input

The first line is an integer T (1 <= T <= 20), which shows the number of the test cases. Each of the following T lines contains an integer W (1 <= W <= (3^20-1)/2), expressing the weight of an object.
Output

For each test case print a line, showing the weights of the poises on the left tray and the right tray. Use a space to separate the left tray and the right tray. The poises on the same tray are arranged in the increasing order, and a comma separates every two of them. If there is no poise on the tray, output "empty".
Sample Input

3
9
5
20
Sample Output

empty 9
1,3 9
1,9 3,27
个人理解:
1:将输入的十进制重量转化为三进制
2:依次判断每个砝码怎么放
3:若该位为0,明显不摆放;若为1,则在右边摆放,该位平衡;若为2,则在左边摆放,左边进行重量叠加,若为3,则进位,进位后就是下一位的问题了
ResultMemoryTimeLanguageCode Length
Accepted200K32MSC++1047B
#include<stdio.h>
#include<math.h>
#include<string.h>
#define N 21
void DY(int a[N],int m);
int main()
{
    int T,W,Right[N],Left[N];
    scanf("%d",&T);
    while(T--)
    {
        int i,m=0;
        memset(Right,0,sizeof(Right));
        memset(Left,0,sizeof(Left));
        scanf("%d",&W);
        while(W)//将十进制转换为三进制
        {
            Right[m++]=W%3;
            W/=3;
        }
        for(i=0;i<m;i++)//处理三进制
        {
            if(Right[i]>=2)
            {
                if(Right[i]==2)
                {
                    Left[i]=1;
                }
                Right[i]=0;
                Right[i+1]++;
            }
        }
        DY(Left,m);
        printf(" ");
        DY(Right,m);
        printf("\n");
    }
    return 0;
}
void DY(int a[N],int m)
{
    int i,c=0;
    for(i=0;i<=m;i++)
    {
        if(!c&&a[i])
        {
            printf("%d",(int)pow(3.0,i*1.0));
            c=1;
        }
        else if(a[i])
        {
            printf(",%d",(int)pow(3.0,i*1.0));
        }
    }
    if(!c)
       printf("empty");
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值