牛客小白月赛42 D&F
- D
题意:使用上取整、下取整、阶乘、算术平方根 四种运算,完成对一个数字的变换。
例如从\(4\)变换到\(6\):
\[6=\Biggl( \biggl\lceil \sqrt{\lceil \sqrt{4!}\rceil}\biggr\rceil\Biggr)!
=\Biggl( \biggl\lceil \sqrt{\lceil \sqrt{24}\rceil}\biggr\rceil\Biggr)!
=\Biggl( \biggl\lceil \sqrt{5}\biggr\rceil\Biggr)!=3!=6
\]
每次阶乘计为一步,每次开根号并向上/向下取整计为一步。
请你找到从\(x\)变换到\(y\)所需的最小步数。如果由\(x\)七步之内不可能变换到\(y\),输出\(-1\)即可
思路:dfs,注意剪枝:\(x>10\) 不用考虑采用阶乘(不然会超时2333
Code:
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int t,x,y,tt,ans,tmp;
int fac(int x){
int res=x;
for(int i=2;i<x;i++) res*=i;
return res;
}
void dfs(int x,int y,int tt){
if(tt>7) return ;
if(tt<=7&&x==y) ans=min(ans,tt);
dfs(ceil(sqrt(x)),y,tt+1);
dfs(floor(sqrt(x)),y,tt+1);
if(x<=10) dfs(fac(x),y,tt+1);
}
int main(){
cin>>t;
while(t--){
cin>>x>>y;
ans=10;
tt=0;
dfs(x,y,0);
if(ans==10) cout<<"-1"<<endl;
else cout<<ans<<endl;
}
return 0;
}

浙公网安备 33010602011771号