前言
这场属于是秒切三题,然后罚座半小时
传送门 :
思路
标签 : 预处理,二进制枚举
虽然题目中有 − 1 -1 −1的情况,但是任意十进制数都可以转为 2 2 2进制数,因此答案一定是有解的
因为 2 15 2^{15} 215已经大于了 1 e 12 1e12 1e12了,因此显然该题可以在暴力情况下求解
因为写不来 d f s dfs dfs(懒得写 b u s h i bushi bushi, 因此我们可以使用使用二进制枚举出所有方案
然后就使用 A c w i n g Acwing Acwing基础课模板, AcWing 801. 二进制中1的个数 (总算有用了
对于每一次合法 t < = n t <= n t<=n的情况下,进行更新答案即可
MyCode
const int N = 1e5+10;
int idx;
ll a[N],n,k;
ll lowbit(ll x){
return x & -x;
}
ll ws(ll x){
ll res = 0 ;
while(x){
x-=lowbit(x);
res++;
}
return res;
}
ll f(int n){
if(n == 1)
return 1;
return n*f(n-1);
}
void cal(){
for(int i = 1 ; i<= 15;i++){
ll t = f(i);
if(t > 1e12){
break;
}
a[idx++] = t;
}
}
void solve()
{
cin>>n;
k=0x3f3f3f3f;
for(ll i= 0 ;i<(1<<idx) ; i++){
ll t = 0 ;
for(ll j = 0 ;j< idx;j++){
if(i&(1<<j))
t+=a[j];
}
if(t <= n)
k = min(k,ws(i)+ws(n-t));
}
cout<<k<<endl;
}
/**mYHeart is my algorithm**/
int main()
{
cal();
int t;cin>>t;while(t -- )
solve();
return 0;
}