C++取整函数ceil(),floor()(例题金蛇狂舞 DFS+取整函数)

原题链接:https://ac.nowcoder.com/acm/contest/11219/D

取整函数

#include <math.h> 

使用floor函数。floor(x)返回的是小于或等于x的最大整数。
如:     floor(10.5) == 10    floor(-10.5) == -11


使用ceil函数。ceil(x)返回的是大于x的最小整数。
如:     ceil(10.5) == 11    ceil(-10.5) ==-10

ceil() 向上取整

cout << "ceil 1.2 = " << ceil(1.2) << endl;      //2

floor() 向下取整

cout << "floor 1.2 = " << floor(1.2) << endl;    //1

题目描述


使用 上取整、下取整、阶乘算术平方根 四种运算,完成对一个数字的变换。

每次阶乘计为一步,每次开根号并向上/向下取整计为一步。

请你找到从 x变换到 y所需的最小步数。
 
链接:https://ac.nowcoder.com/acm/contest/11219/D
来源:牛客网

输入描述:

  第一行输入数据组数 T(1≤T≤49)
  接下来每行输入两个正整数 x,y(1≤x,y≤7)

输出描述:

每行输出一个整数,表示由 x 变换到 y 的最小步数,如果由 x 七步之内不可能变换到 y,输出 -1 即可。
题解:

使用 上取整、下取整、阶乘、算术平方根 四种运算,完成对一个数字的变换。每次阶乘计为一步,每次开根号并向上/向下取整计为一步。
我的思路就是用 DFS对 三种情况进行递归处理 如果他的步数超过7就return返回,因为考虑到多次使用阶乘数 ,开始先枚举1到10的阶乘
数,将他们放入数组,代码如下

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define FOR(i, a, b) for (int i = (a); i <= (b); ++i)
#define DEC(i, a, b) for (int i = (a); i >= (b); --i)
const int MAXN = 100000;
using namespace std;
int a,b,x;
ll jc[20]; //存储阶乘数
void dfs(int step, int m) {
  if(step > 7 ) return;
  if(m == b) {
    x = min(x,step);
    return;
  }
  dfs(step+1,ceil(sqrt(m))); //向上取整
  dfs(step+1,floor(sqrt(m))); //向下取整
  if(m<=10)
    dfs(step+1,jc[m]);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0),cout.tie(0);
  int t;
  ll sum = 1;
  for(int i = 1; i<=10; ++i) {
    sum*=i;
    jc[i] = sum;
  }
  cin >> t;
  while(t--) {
    cin >> a >> b;
    x = 1 << 30;
    dfs(0,a);
    if(x != 1<<30)
      cout << x << endl;
    else
      cout << -1 << endl;
  }
  return 0;
}

 
posted @   高级摸鱼怪  Views(217)  Comments(0Edit  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示