首页 > 其他分享 >HDU - 2717

HDU - 2717

时间:2022-11-02 17:23:38浏览次数:89  
标签:HDU 2717 int pp bfs step now fl

大概是自己第一次在图之外用搜索吧(wwww
要是早点做过的话可能蓝桥省赛的那个记忆化搜索就能a出来了hhh

https://vjudge.net/problem/HDU-2717#author=shiyifan(这是hdu源链接,交不了)

https://vjudge.net/contest/476730#status/weixinjie/C/0/(不知道为啥东北师范的训练还能交,补了之后ac了)

题目

农场主约翰已被告知一头逃亡母牛的位置,他想立即抓住她。他从一条数线上的点N(0≤N≤100,000)开始,而cow在同一条数线上的点K(0≤K≤100,000)。农夫约翰有两种交通方式:步行和传送。 *步行:FJ可以在一分钟内从任何X点移动到X-1或X+1点 *传送:FJ可以在一分钟内从任意X点移动到2×X点。 如果这头母牛没有意识到它的追求,根本不动,农夫约翰需要多长时间才能找回它?

输入

第1行:两个空格分隔的整数:N和K(多组输入)

输出

第1行:农场主约翰抓住逃亡的母牛所需的最少时间,以分钟为单位。

样例

输入样例1

5 17

输出样例1

4

分析

从n开始跑到k,有n+1、n-1、n*2这三种方式

从输入开始分类讨论,当n大于等于k时直接输出n-k的值

当n小于k时,对三种移动方式进行bfs

bfs的原理就是把n移动后的三个数字放入队列中,再对这三个数做判断

那么就要判断当前这个数有没有被访问过,则建立一个2max的数组(n取到最大时,进行n2也不会溢出)

如果没有溢出且n移动后依然不等于k;就给步数加一并压入队列

如何实现?当然是结构体,结构体包括两个整数:n,表示数字;step,表示步数

当n移动后与k相等,就输出now.step

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
#define maxx 100005
using namespace std;

struct nub {//储存这个数字的结构体
	int n;
	int step;
};

int fl[maxx * 2];
int main() {
	int n, k;
	while (scanf("%d %d", &n, &k) != EOF) {
		int i;
		queue <nub> q;//建立用于bfs的队列
		for (i = 0; i < maxx * 2 - 5; i++) {
			fl[i] = 1;//首先将用于标记的数组初始化为全部可访问
		}
		fl[n] = 0;
		if (n > k) {//n大于等于k时直接输出n-k,n==k的特判其实没必要但懒得改了 .U^U.
			printf("%d\n", n - k);
		} else if (n == k) {
			cout << 0 << endl;
		} else {
			struct nub fir;//定义做出的数的结构体(first)
			fir.n = n;//数字初始化为n
			fir.step = 0;//步数初始化为0
			q.push(fir);//把第一个数压入队列
			while (!q.empty()) {//当不为空时循环
				struct nub now;//当前数字结构体
				now = q.front();q.pop();//从队列取出数字放入now
				if (now.n == k) {//如果now.n与k相等,直接输出步数
					printf("%d\n", now.step);
					break;
				}
				if (now.n>=0&&n + 1 <= 100000) {//这里需要判断移动后的数在0和max之间,一开始忘了光wa
					if (fl[now.n + 1]) {
						fl [now.n + 1] = 0;//满足条件后先标记,省着忘了
						struct nub pp;
						pp.n = now.n + 1;//把移动后的数压入结构体
						pp.step = now.step + 1;//步数加一
						q.push(pp);//结构体压入队列
					}
				}
				if (now.n - 1 >= 0 && fl[now.n - 1]) {//原理同上
					fl[now.n - 1] = 0;
					struct nub pp;
					pp.n = now.n - 1;
					pp.step = now.step + 1;
					q.push(pp);
				}
				if (now.n * 2 <= 100000 && now.n >= 0) {//原理同上
					if (fl[now.n * 2]) {
						fl[now.n * 2] = 0;
						struct nub pp;
						pp.n = now.n * 2;
						pp.step = now.step + 1;
						q.push(pp);
					}
				}
			}
		}
	}
}

反思

开始甚至没想到bfs怎么写,算是对bfs有更深刻理解了

其次是标记数组为2*max,开始开了max光报错return time error

还有那个每次移动后都要判断在不在0~max间,一开始理解不利了是蒙上去的,后来想想如果不判断迟早会对max*2意外的数移动,那么判断的时候就会访问到max**2以外的部位导致数组越界报错return time error

总的来说就是个bfs,但这是第一次ac出来没有在二维数组里bfs的题,标记一下

标签:HDU,2717,int,pp,bfs,step,now,fl
From: https://www.cnblogs.com/Chitoge/p/16851662.html

相关文章

  • 树上连通有关背包:【BZOJ4182】shopping &【HDU6566】The Hanged Man
    选这两道题是因为这两道题都是树上背包,而且选的点的要求都与连通性有关,而且都是按dfs序DP来模拟不断加入物品,而且都能用树剖和点分治优化(不过优化的点一个跟子树大小有......
  • 【XSY3890】【hdu5263】平衡大师(二分,上下界网络流)
    不妨令\(k=m-k\),那么题目的意思就是至多删去\(k\)条边。首先二分答案\(t\),然后求最少需要删去多少的边,如果最少需要删去的边\(\leqk\)则合法。在原图中统计每一个......
  • 【HDU6326】Monster Hunter(树上一类全序问题)
    先考虑没有树的限制,即我们可以任意安排顺序打怪兽,那么这就是一个全序问题。考虑在某种顺序下,假设初始血量为\(st\),那么打到第\(i\)个怪物时剩余的血量就是\(st+\sum\l......
  • HDU5869 Different GCD Subarray Query 离线查询/区间贡献
    题目思路首先,区间收敛到的时间是,那么用维护区间内不同数字的数目的思路解决。预处理所有右端点的集合枚举右端点,加入右端点集合的贡献;如果在加入某个值时发现之前出现过,那么......
  • HDU 3033 I love sneakers!
    题目链接:​​传送门​​题面:Ilovesneakers!ProblemDescriptionAftermonthsofhardworking,Iserlohnfinallywinsawesomeamountofscholarship.Asagreatz......
  • HDU 2639 Bone Collector II
    题目链接:​​传送门​​​题面:ProblemDescriptionThetitleofthisproblemisfamiliar,isn’tit?yeah,ifyouhadtookpartinthe“RookieCup”competition,you......
  • HDU 1712 ACboy needs your help
    题目链接:​​传送门​​题面:ACboyneedsyourhelpProblemDescriptionACboyhasNcoursesthisterm,andheplanstospendatmostMdaysonstudy.Ofcourse,the......
  • HDU 2159 FATE
    题目链接:​​传送门​​题面:FATEProblemDescription最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又......
  • HDU 3466 Pround Merchants
    题目链接:​​传送门​​题面:ProudMerchantsProblemDescriptionRecently,iSeawenttoanancientcountry.Forsuchalongtime,itwasthemostwealthyandpow......
  • HDU 1171 Big Event In HDU
    题目链接:​​传送门​​BigEventinHDUProblemDescriptionNowadays,weallknowthatComputerCollegeisthebiggestdepartmentinHDU.But,maybeyoudon’t......