牛客小白月赛42 D&F

牛客小白月赛42

  • 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;
}
posted @ 2021-12-19 16:05  Wraith-Fiee  阅读(92)  评论(0)    收藏  举报