题意:给定20个砝码,分别为3^i(i=0~19)。给定一个物品,放在天平左盘,左右皆可放砝码,如何放能平衡。
分析:先将给定物品的重量化为3进制。我们要让两端平衡,即让两端的三进制数各位相等,每个砝码是3进制某一位上的一个1。我们需要在左盘某些位加1(即向左盘加对应砝码),使得与原物品的重量之和化为3进制后各位都不为2,然后在右盘现在全为0,可直接将某些位变为1(即向右盘加对应砝码)凑出左盘的只有0和1的3进制数。
View Code
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
#define maxn 25
int n;
int f[maxn];
bool l[maxn], r[maxn];
int ans[maxn];
void print(bool x[])
{
bool first = true;
for (int i = 0; i < maxn; i++)
if (x[i])
{
if (first)
first = false;
else
putchar(',');
printf("%d", ans[i]);
}
if (first)
printf("empty");
}
int main()
{
//freopen("t.txt", "r", stdin);
ans[0] = 1;
for (int i = 1; i <= 19; i++)
ans[i] = ans[i - 1] * 3;
int t;
scanf("%d", &t);
while (t--)
{
int x;
scanf("%d", &x);
n = 0;
memset(f, 0, sizeof(f));
while (x > 0)
{
f[n++] = x % 3;
x /= 3;
}
memset(l, 0, sizeof(l));
memset(r, 0, sizeof(r));
int j = 0;
for (int i = 0; i < maxn; i++)
{
int x = f[i] + j;
if (x < 2)
{
f[i] = x;
r[i] = x;
j = 0;
continue;
}else
{
l[i] = (x == 2);
f[i] = 0;
j = 1;
}
}
print(l);
putchar(' ');
print(r);
putchar('\n');
}
return 0;
}