题目链接:点击打开链接
题目大意:有些3的幂的重量的砝码,现在给定任意一质量的重物,现在要求怎么样放置才能平衡
题目分析:将重物转化为三进制(0,1,2),先要分成3的幂,所以见2 就要想办法变为1,见1如果有前面的进位,那么也要进行进位。
最终得到的没有2的数则为右边的重量,左边的所需要的则是刚才调整时用到的重量
由于是自己做法,有点搓欢迎斧正
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
long long n;
int posi;
int tril[25];
int solve(int m)
{
int i=1,flag=0,tmp;
memset(tril,-1,sizeof(tril));
while(m)
{
tril[i++]=tmp=m%3;
if(tmp==2) flag=1;
m=m/3;
}
posi=i-1;
if(!flag) return 1;
return 0;
}
void digit(int k)
{
long long ans=1;
while(k--)
{
ans*=3;
}
printf("%lld",ans);
}
void solve2()
{
int i,left[25],right[25],c=0,tmp=0;
memset(left,0,sizeof(left));
for(i=1;i<=posi+1;i++)
{
if(tril[i]==2&&c)
tril[i]=0;
else if(tril[i]==2)
{
tril[i]=0;
c=1;left[i]=1;
}
else if(tril[i]==1&&c)
{
left[i]=1;tril[i]=0;
}
else if(tril[i]==-1 && c)
tril[i]=1;
else if(tril[i]!=-1)
{
tril[i]+=c;c=0;
}
}
int first=0;
for(i=1;i<=posi+1;i++)
{
if(left[i]==1)
{ if(!first) first=1;
else
printf(",");
digit(i-1);
}
}
first=0;
printf(" ");
for(i=1;i<=posi+1;i++)
{
if(tril[i]==1)
{ if(!first) first=1;
else
printf(",");
digit(i-1);
}
}
printf("\n");
}
int main()
{
int t,first;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
if(solve(n))
{ first=0;
printf("empty ");
for(int i=0;i<=posi;i++)
{
if(tril[i]==1)
{
if(!first) first=1;
else
printf(",");
digit(i-1);
}
}
printf("\n");
}
else
solve2();
}
return 0;
}