这是一道不错的数学题,开始的时候就只想到于三进制有关系,由于还有一个最优化的问题……开始还以为需要用到深搜的策略。
但是正确的解法却也是因为三进制才没有使用深搜的策略。
以三进制表示一个数:
1.如果数位上为1,则应该在右侧放上一个权值。
2.如果数位上为2,则该在左侧放上一个权值。
3.如果位数上为0,则什么都不需要做。
源代码:
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
int main()
{
int n;
cin >>n;
while(n--)
{
int a;
vector< int > left, right;
cin >>a;
int t=0;
while(a)
{
int temp;
temp=a%3;
if(temp==1)
{
right.push_back(int(pow(3.0,t)));
a/=3;
}
else if(temp==2)
{
left.push_back(int(pow(3.0,t)));
a=a+3;
a/=3;
}
else
a/=3;
t++;
}
if(left.size()==0)
cout<<"empty"<<" ";
else
{
for(int i=0;i<left.size()-1;i++)
cout<<left[i]<<",";
cout<<left[left.size()-1]<<" ";
}
if(right.size()==0)
cout<<"empty"<<endl;
else
{
for(int i=0;i<right.size()-1;i++)
cout<<right[i]<<",";
cout<<right[right.size()-1]<<endl;
}
}
return 0;
}