​https://ac.nowcoder.com/acm/contest/11177/C​

题意:

给出你牛客练习赛87 牛老板(思维暴搜)_打表牛客练习赛87 牛老板(思维暴搜)_i++_02,然后组成n问最少几张。

分析:

我们采取小于1e7的可以直接打表得到。那么大于1e7的那。大于1e7我们就搜索,是牛客练习赛87 牛老板(思维暴搜)_打表_03答案更少还是牛客练习赛87 牛老板(思维暴搜)_牛客练习赛_04更少。最后去个最小值。

<ll, ll>mp;
ll n,a6[50],a9[50];
int ans[maxn];
void init(){
a6[0]=a9[0]=1;
for(int i=1;i<40;i++){
a6[i]=a6[i-1]*6;
a9[i]=a9[i-1]*9;
}
for(int i=1;i<6;i++){
ans[i]=i;
}
for(int i=6;i<maxn;i++){
ans[i]=maxn;
for(int j=1;j<maxn&&j<=i;j*=6){
ans[i]=min(ans[i],ans[i-j]+1);
}
for(int j=1;j<maxn&&j<=i;j*=9){
ans[i]=min(ans[i],ans[i-j]+1);
}
}
}
int check(ll x){
if(x< maxn) return ans[x];
if(mp[x]) return mp[x];

int k=log(x)/log(9)+1e-8;
int ans1=check(x-a9[k]);

k=log(x)/log(6)+1e-8;
ans1=min(ans1,check(x-a6[k]));
return mp[x] =ans1+1;
}
void solve()
{
cin>>n;
printf("%d\n",check(n));
}