这是我见过最牛逼的代码!

博客提到外包公司所写的代码令人惊叹,作者看后反应强烈,虽未详细说明代码情况,但凸显了代码的特别之处。
部署运行你感兴趣的模型镜像

外包公司写的,真的666

<a href="javascript:alert("清除成功");">清除缓存</a>

看的我一愣一愣的。

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

# 题目重述 我们有两个勺子,容量分别是 3 mL 和 10 mL。有一个装着牛奶的容器,初始时里面有 $ N $ mL 牛奶,目标是让它变成 $ K $ mL。 每次操作只能用其中一个勺子: - 把牛奶**舀进去**(+3 或 +10) - 或者把牛奶**舀出来**(-3 或 -10) 问:少需要多少次操作才能让容器中的牛奶恰好变为 $ K $ mL? --- # 详解 ### 🌟 第一步:理解题意 举个例子: 假设现在有 $ N = 8 $ mL,想变成 $ K = 9 $ mL。 你能做的操作只有: - 加 3 → +3 - 减 3 → -3 - 加 10 → +10 - 减 10 → -10 所以你可以一步步尝试不同的组合,比如: - 8 → 11(+3)→ 1(-10)→ 4(+3)… 显然不行 - 8 → 18(+10)→ 15(-3)→ 5(-10)→ 8(+3)… 又回来了 这看起来很乱?那怎么办? 👉 我们需要一种系统的方法——这就是 **宽度优先搜索(BFS)** --- ### 🌟 第二步:把问题转化成“走迷宫” 想象你在玩一个数字游戏,你站在数字 $ N $ 上,你的目标是走到数字 $ K $。 你每次可以走四步: - 向右走 3 步:$ +3 $ - 向左走 3 步:$ -3 $ - 向右走 10 步:$ +10 $ - 向左走 10 步:$ -10 $ 但你不能重复踩同一个数字(否则会无限转圈)。你要找的是**快到达 $ K $ 的路径长度**(也就是少操作次数)。 ✅ 这就是典型的 **短路径问题**,而 BFS 就是用来解决这种问题的! --- ### 🌟 第三步:BFS 是怎么工作的? BFS 就像往水里扔一块石头,涟漪一圈一圈地扩散出去。 第一圈:从起点出发,能一步到达的所有状态 第二圈:从那些状态再走一步,能到的所有新状态 …… 直到某一圈里出现了目标值 $ K $,那就停止 —— 此时的“圈数”就是答案! 🔍 关键点: - 每一层代表一次操作后的结果 - 第一次碰到 $ K $ 一定是**少步数** - 要记录哪些数字已经走过(避免回头) --- ### 🌟 第四步:动手写代码(从零开始) 我们一步一步来写 C++ 代码。 #### ✅ 1. 包含必要的头文件 ```cpp #include <iostream> #include <queue> // 用来做队列(BFS的核心) #include <unordered_set> // 用来记录访问过的状态(防止重复) using namespace std; ``` #### ✅ 2. 定义常量 ```cpp const int A = 3; // 小勺子 const int B = 10; // 大勺子 ``` #### ✅ 3. 写 BFS 函数 函数名字叫 `minSteps(N, K)`,返回少操作次数。 ```cpp int minSteps(int start, int target) { if (start == target) return 0; // 一开始就在目标,不用操作 ``` 创建一个队列,存放当前层的所有状态: ```cpp queue<int> q; q.push(start); // 先把起始状态放进去 ``` 创建一个集合,记录哪些数字已经被访问过了: ```cpp unordered_set<int> visited; visited.insert(start); ``` 现在开始一层一层扩展: ```cpp int steps = 0; // 当前走了几步 while (!q.empty()) { int size = q.size(); // 当前这一层有几个状态 steps++; // 进入下一层,操作数+1 // 处理当前层的所有状态 for (int i = 0; i < size; ++i) { int cur = q.front(); q.pop(); // 四种可能的操作 int nextStates[4] = {cur + A, cur - A, cur + B, cur - B}; for (int next : nextStates) { if (next == target) { return steps; // 找到了!直接返回当前步数 } // 如果没访问过,并且还在合理范围内 if (visited.find(next) == visited.end() && abs(next - target) <= 200) { visited.insert(next); q.push(next); } } } } return -1; // 理论上应该总能到达 } ``` > 💡 `abs(next - target) <= 200` 是为了防止无限扩展。比如你从 0 开始一直 +10,会跑到几万,没必要。 --- #### ✅ 4. 主函数读入数据 题目说有多组测试数据,所以我们用 `while(cin >> N >> K)` 来持续读取。 ```cpp int main() { int N, K; while (cin >> N >> K) { cout << minSteps(N, K) << endl; } return 0; } ``` --- ### ✅ 终完整代码(带注释) ```cpp #include <iostream> #include <queue> #include <unordered_set> #include <cstdlib> // abs 函数 using namespace std; const int A = 3; const int B = 10; int minSteps(int start, int target) { if (start == target) return 0; queue<int> q; unordered_set<int> visited; q.push(start); visited.insert(start); int steps = 0; while (!q.empty()) { int size = q.size(); steps++; for (int i = 0; i < size; ++i) { int cur = q.front(); q.pop(); int nextStates[4] = {cur + A, cur - A, cur + B, cur - B}; for (int next : nextStates) { if (next == target) { return steps; } // 未访问且在合理范围内 if (visited.find(next) == visited.end() && abs(next - target) <= 200) { visited.insert(next); q.push(next); } } } } return -1; } int main() { int N, K; while (cin >> N >> K) { cout << minSteps(N, K) << endl; } return 0; } ``` --- ### 🌟 第五步:如何默写?(记忆技巧) 记住这个结构口诀: > 🔁 **一层一层扩,队列来帮忙;** > 🔍 **四种操作试,见过就不放;** > 🎯 **遇到目标就返回,步数正好是答案。** 默写流程: 1. `#include` 三大件:`iostream`, `queue`, `unordered_set` 2. 定义 `A=3`, `B=10` 3. 写函数:`int minSteps(int s, int t)` 4. 判断相等直接 return 0 5. 初始化队列 + set 6. `steps=0`,然后 `while(!q.empty())` 7. `size=q.size(); steps++` 8. `for(i=0; i<size; i++)` 拿出 front,pop 9. 定义数组四种变化 10. foreach 新状态: - 是目标?return steps - 没访问过且合理?插入 set 和 queue 11. main 函数循环读 N K 输出 --- # 知识点 - **广度优先搜索(BFS)**:逐层扩展,首次到达目标即为优解,适用于少操作类问题。 - **状态去重**:使用哈希集合避免重复访问,防止死循环,提升效率。 - **合理剪枝**:通过限制搜索范围(如与目标差值不超过200)防止内存溢出。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值