2971 抓住那头牛 noi.openjudge

http://noi.openjudge.cn/ch0205/2971/
总时间限制: 
2000ms

内存限制: 
65536kB
描述

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

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

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

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

输入
两个整数,N和K
输出
一个整数,农夫抓到牛所要花费的最小分钟数
样例输入
5 17
样例输出
4

BFS

 1 #include <iostream>
 2
 3 #define maxn 100000
 4
 5 using namespace std;
 6
 7 int s,t,head,tail;
 8
 9 bool vis[maxn+5];
10
11 struct node
12 {
13     int now,val;
14 }que[maxn+5];
15
16 int main()
17 {
18     cin>>s>>t;
19     que[tail].now=s;
20     que[tail++].val=0;
21     vis[s]=1;
22     while(head<tail)
23     {
24         int now=que[head].now,val=que[head].val;
25         if(now==t)
26         {
27             cout<<val;
28             return 0;
29         }
30         if(!vis[now*2]&&now*2<=maxn&&now)
31         {
32             que[tail].now=now*2;
33             que[tail++].val=val+1;
34             vis[now*2]=1;
35         }
36         if(!vis[now+1]&&now+1<=maxn&&now<t)
37         {
38             que[tail].now=now+1;
39              que[tail++].val=val+1;
40              vis[now+1]=1;
41
42         }
43         if(!vis[now-1]&&now>0)
44         {
45             que[tail].now=now-1;
46              que[tail++].val=val+1;
47              vis[now-1]=1;
48         }
49         head++;
50     }
51     return 0;
52 }

无限ER

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4
 5 using namespace std;
 6
 7 int n,k;
 8 int b[100005];
 9
10 struct sop
11 {
12     int sum;
13     int step;
14 }queue[100005];
15
16 void bfs(int n,int k)
17 {
18     int head=0;
19     int tail=1;
20     queue[tail].sum=n;
21     queue[tail].step=0;
22     b[n]=1;
23     while(head<tail)
24     {
25         head++;
26         if(queue[head].sum==k)
27         {
28             cout<<queue[head].step;
29             return;
30         }
31         if(!b[queue[head].sum*2]&&(queue[head].sum*2<=100000)&&(queue[head].sum!=0))
32         {
33             tail++;
34             queue[tail].sum=queue[head].sum*2;
35             b[queue[head].sum*2]=1;
36             queue[tail].step=queue[head].step+1;
37         }
38         if(!b[queue[head].sum+1]&&(queue[head].sum+1<=100000)&&(queue[head].sum+1<=k))
39         {
40             tail++;
41             queue[tail].sum=queue[head].sum+1;
42             b[queue[head].sum+1]=1;
43             queue[tail].step=queue[head].step+1;
44         }
45         if(!b[queue[head].sum-1]&&(queue[head].sum-1>=0))
46         {
47             tail++;
48             queue[tail].sum=queue[head].sum-1;
49             b[queue[head].sum-1]=1;
50             queue[tail].step=queue[head].step+1;
51         }
52     }
53     return ;
54 }
55
56 int main()
57 {
58     cin>>n>>k;
59
60     bfs(n,k);
61     return 0;
62 }

AC题解

时间: 2024-10-05 05:00:18

2971 抓住那头牛 noi.openjudge的相关文章

OpenJudge 2971 抓住那头牛

总时间限制:  2000ms 内存限制:  65536kB 描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次移动花费一分钟 2.从X移动到2*X,每次移动花费一分钟 假设牛没有意识到农夫的行动,站在原地不动.农夫最少要花多少时间才能抓住牛? 输入 两个整数,N和K 输出 一个整数,农夫抓到牛所要花费的最小分钟数 样例输入 5 1

openjudge 2971:抓住那头牛 解题报告

总时间限制: 2000ms 内存限制:  65536kB 描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次移动花费一分钟. 2.从X移动到2*X,每次移动花费一分钟. 假设牛没有意识到农夫的行动,站在原地不动.农夫最少要花多少时间才能抓住牛? 输入 两个整数,N和K 输出 一个整数,农夫抓到牛所要花费的最小分钟数 样例输入 5

2971:抓住那头牛

总时间限制: 2000ms 内存限制: 65536kB 描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次移动花费一分钟 2.从X移动到2*X,每次移动花费一分钟 假设牛没有意识到农夫的行动,站在原地不动.农夫最少要花多少时间才能抓住牛? 输入 两个整数,N和K 输出 一个整数,农夫抓到牛所要花费的最小分钟数 样例输入 5 17

OpenJudge 4001:抓住那头牛

题目链接 题解: 这个题可以用广搜来解决,从农夫到牛的走法每次都有三种选择,定义一个队列,把农夫的节点加进队列,然后以这三种走法找牛,队列先进先出,按顺序直到找到牛的位置. 代码: #include<iostream> #include<stdio.h> #include<queue> #include<cstring> using namespace std; int n,k; #define MAX 1e5 const int MAX_N=1e5+5;

抓住那头牛

[题目描述] 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0 <= N <= 100000),牛位于点K(0 <= K <= 100000).农夫有两种移动方式: (1)从X移动到X-1或X+1,每次移动花费一分钟: (2)从X移动到2*X,每次移动花费一分钟: 假设牛没有意识到农夫的行动,站在原地不动.农夫最少要花多少时间才能抓住牛? [输入描述] 输入两个整数N.K. [输出描述] 输出一个整数,农夫抓到牛所要花费的最小分钟数. [样例输入] 5

bfs 抓住那头牛

这是题目呀!http://ybt.ssoier.cn:8088/problem_show.php?pid=1253 算法分析:看到这道题目要求为最短时间,就可以判断用bfs(按照距开始状态由远及近的顺序进行搜索),而不是dfs. 在搜索过程中还可能遇到重复搜索的结果,这时我们就可以引入一个队列,使得已搜过的节点入队,再以此为下一层的父节点出队,以此往复. #include <iostream> #include<cstdio> #include <queue>#defi

抓住那头牛【题解】

一个玄学的广搜边界>=0,<=k+10,这个边界可能可以数学上证明,其他就是简单的广搜,然后输出步数,就可以了 #include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue>

codevs 3060 抓住那头奶牛 x

3060 抓住那头奶牛 USACO 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 农夫约翰被告知一头逃跑奶牛的位置,想要立即抓住它,他开始在数轴的N 点(0≤N≤100000),奶牛在同一个数轴的K 点(0≤K≤100000). 约翰有两种移动方式:1 分钟内从x 点移动到x+1 或x-1:1 分钟内从x 点移动到2x.假设奶牛不会移动,约翰抓住它需要多少时间? 输入描述 Input Description 一行两个整数N 和K

noi openjudge 1768:最大子矩阵

http://noi.openjudge.cn/ch0406/1768/ 描述已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的矩阵 0 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2 的最大子矩阵是 9 2-4 1-1 8 这个子矩阵的大小是15.输入输入是一个N * N的矩阵.输入的第一行给出N (0 < N <= 100).再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从