Eva's Balance
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 4199 | Accepted: 2021 |
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
Source
个人理解:题目大意,天平砝码放置,有重量为1、3、9、27、81 .. 3^K... 3^19 砝码,天平左边给定一个重量值w (1=< w <= (3^20-1)/2 ),求如何摆放砝码使天平两端达到平衡。因此通过将其转化为三进制进行判断该不该在左侧加砝码,以及在左右两侧加多少砝码。同时,逗号的取舍以及空格的选取通过循环进行实现。
结果 | 内存 | 时间 | 语言 | 代码长度 |
Accepted | 204K | 63MS | C | 954B |
#include<stdio.h>
#include<math.h>//下面用到了pow()函数;
#include<string.h>
int i, j, k, m;
int flag1 , flag2 ;
int main()
{
int N;
scanf("%d", &N);
while (N--)//组别非负;
{
int a[25];
memset(a, 0, sizeof(a));//将数组内的值都初始化为0;
scanf("%d", &m);
for (i = 0; m != 0; i++)//将其转化为三位制,当m为0结束循环;
{
a[i] = m % 3;
m = (m - a[i]) / 3;
}
for (j = 0; j<i; j++)//三进制内运算(数组内各元素只能为-1,0,1);
{
if (a[j] == 2)
{
a[j + 1]++;
a[j] = -1;
}
else if (a[j] == 3)
{
a[j + 1]++;
a[j] = 0;
}
}
flag1 = 0, flag2 = 0;
for (k = 0; k <= i; k++)
{
if (a[k] == -1)
{
if (flag1)printf(",");
flag1 = 1;
printf("%.0lf", pow((double)3, (double)k));
}
}
if (flag1 == 0)printf("empty");//如果左边无需加法吗,则输出"empty";
printf(" ");
for (k = 0; k <= i; k++)
{
if (a[k] == 1)
{
if (flag2)printf(",");
flag2 = 1;
printf("%.0lf", pow((double)3, (double)k));
}
}
printf("\n");
}
return 0;
}