1. 程式人生 > 其它 >C++取整函式ceil(),floor()(例題金蛇狂舞 DFS+取整函式)

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;
}