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 的最小步数,如果由 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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)