poj1702

题意:给定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;
}
原文地址:https://www.cnblogs.com/rainydays/p/2147067.html