信息学奥赛一本通 1253:抓住那头牛

博客围绕农夫抓牛问题展开,农夫和牛在数轴上,农夫起始于点N,牛在点K。农夫有两种移动方式,一是X移动到X - 1或X + 1,二是X移动到2X,每次移动耗时一分钟,牛原地不动,需计算农夫抓到牛的最少时间。

题目

【题目描述】

农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000)。农夫有两种移动方式:

1、从X移动到X−1或X+1,每次移动花费一分钟

2、从X移动到2X,每次移动花费一分钟

假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?

【输入】

两个整数,N和K。

【输出】

一个整数,农夫抓到牛所要花费的最小分钟数。

【输入样例】

5 17

【输出样例】

4

代码

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N = 1e5 + 11;
queue<int> q;
int dis[N];
void push(int x, int p) {  // x入队,记录距离
	q.push(x);
	dis[x] = dis[p] + 1;
}
int check(int f) {  // 检查f是否能走
	return f >= 0 && f < N&& dis[f] == -1;
}
int bfs(int n, int k) {  // 广搜
	q.push(n);
	dis[n] = 0;
	while (q.size()) {
		int t = q.front();
		if (t == k) return dis[t];
		q.pop();
		if (check(t - 1)) push(t - 1, t);
		if (check(t + 1)) push(t + 1, t);
		if (check(t * 2)) push(t * 2, t);
	}
	return -1;
}
int main() {
	int n, k;
	cin >> n >> k;
	memset(dis, -1, sizeof dis);  // 初始化dis为-1
	cout << bfs(n, k) << endl;
	return 0;
}

评测结果

<think>好的,我现在需要帮助用户解答关于信息学奥赛一本中Floyd算法相关的题目1421的解法。首先,用户引用了三个参考内容,其中引用[2]提到了使用Floyd算法求传递闭包的问题,涉及珍珠的重量关系判断。引用[3]是关于最短路径的问题,可能涉及Floyd算法在最短路径中的应用。但题目1421的具体内容用户没有直接给出,所以需要根据题号推测题目内容。 首先,我需要确认题目1421的具体内容。根据信息学奥赛一本的目录或常见题目,1421可能涉及Floyd算法的应用,比如求多源最短路径、传递闭包,或者解决类似关节点的问题。用户提供的引用[2]中的1384题使用了Floyd算法求传递闭包,而引用[3]中的1345题是关于最短路径的。所以可能1421题是类似的问题,比如求两点间的最短路径或判断连性。 接下来,我需要回忆或查找信息学奥赛一本中题目1421的具体描述。假设题目1421是关于使用Floyd算法计算图中各顶点间的最短路径,或者类似的应用。比如,可能要求计算所有节点对之间的最短路径,并处理特定条件。 假设题目1421类似于“计算图中每个顶点到其他顶点的最短路径,并找出符合某种条件的顶点”,那么解法步骤可能包括: 1. 初始化邻接矩阵,设置初始距离。 2. 应用Floyd算法的三重循环更新最短路径。 3. 遍历所有顶点,计算满足条件的值,比如总和、平均值等。 4. 输出结果。 根据用户提供的引用[2],其中使用Floyd算法求传递闭包,而引用[3]使用最短路径,可能1421题结合了这两种应用,或者需要处理特定条件,如中间重量的判断,但需要更具体的信息。 由于用户没有提供题目1421的具体内容,我需要根据常见Floyd算法题目进行推测,并给出一个可能的解法框架。例如,假设题目是求所有点对的最短路径中的最大值,或者找出某个中心点,使得该点到其他点的最大距离最小等。 为了确保准确性,可能需要提醒用户,如果题目涉及传递闭包,可以参考引用[2]的方法;如果涉及最短路径,可以参考引用[3]中的方法。此外,Floyd算法的典型应用包括多源最短路径和传递闭包,所以解法可能涉及这些方面。 现在,根据现有信息,我需要构建一个可能的解答,假设题目1421类似于计算每个顶点到其他顶点的最短路径,并找出某个特定值,比如中心点。例如,计算每个节点到其他节点的最短路径之和,并找出最小的那个,类似于引用[3]中的问题,但使用Floyd算法代替Dijkstra算法。 可能的步骤包括: 1. 初始化距离矩阵,处理输入数据。 2. 应用Floyd算法更新最短路径。 3. 遍历每个节点,计算其到所有其他节点的路径总和。 4. 找出总和最小的节点并输出。 但需要根据具体题目调整。由于题目编号1421可能对应的实际题目可能不同,我需要给出一个用的Floyd算法解题框架,并结合可能的条件处理。 最后,生成相关问题,帮助用户进一步理解Floyd算法的应用场景和变种问题。</think>关于信息学奥赛一本中Floyd算法的题目1421,根据引用内容推测可能是**求多源最短路径或传递闭包类问题**。以下是一个基于Floyd算法的典型解法框架及示例: --- ### **题目1421可能的解法分析** 假设题目要求:计算有向图中所有顶点对的最短路径,并统计满足特定条件的顶点或路径数量(例如路径长度不超过某值的对数)。 #### **步骤解析** 1. **初始化邻接矩阵** 定义二维数组`dist`,`dist[i][j]`表示顶点$i$到$j$的最短距离。初始时,若存在边$i \to j$,则`dist[i][j]`为边权;否则设为无穷大,`dist[i][i] = 0`。 2. **应用Floyd算法更新最短路径** 过三重循环动态更新最短路径: ```python for k in range(1, n+1): for i in range(1, n+1): for j in range(1, n+1): if dist[i][j] > dist[i][k] + dist[k][j]: dist[i][j] = dist[i][k] + dist[k][j] ``` 3. **统计满足条件的路径** 例如统计长度不超过$K$的路径对数: ```python count = 0 for i in range(1, n+1): for j in range(1, n+1): if i != j and dist[i][j] <= K: count += 1 ``` 4. **输出结果** 根据题目具体条件输出统计值或最短路径信息。 --- ### **示例代码(以最短路径为例)** ```python n = 4 # 顶点数 INF = float('inf') dist = [ [0, 2, 6, 4], [INF, 0, 3, INF], [7, INF, 0, 1], [5, INF, 12, 0] ] for k in range(n): for i in range(n): for j in range(n): dist[i][j] = min(dist[i]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值