捉住那头牛以及Potions (Hard Version)(广搜bfs以及queue用法(包含优先队列)

本文介绍了两种利用广搜(BFS)解决数轴问题的实例,包括农夫抓牛问题和病人吃药问题。在农夫抓牛问题中,农夫有两种移动方式,目标是找到最短时间抓住牛。通过BFS实现搜索,利用队列存储状态,并更新步数。在病人吃药问题中,利用优先队列处理负数药品,确保健康度始终为正,最大化吃药数量。这两个问题都展示了广搜和优先队列在解决路径规划和优化问题中的应用。

题目:

农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?

//这道题刚开始没想到广搜,其实就是把普遍广搜深搜模板题的四个或者八个方向变成了三个方向,本质都是每个都要搜一遍;

//queue用法:

queue<typename> name;   //typename可以是任意基本基本数据类型或者容器;

queue为一个容器,符合先进先出原则,即可以用q.push往q里插入数据,删除数据的时候用q.pop()按照输入顺序删除;

一些queue常用函数

1.push() 在队尾插入一个元素;

2.pop() 删除队列第一个元素;

3.size()返回队列中元素个数;

4.empty()判断队列是否为空,如果为空返回ture;

5.front() 返回队列中第一个元素;

6.back() 返回队列中最后一个元素;

//优先队列写法

priority_queue<long long,vector<long long>,greater<long long> >q;

可以将long long改成int或者其他类型;

greater为从小到大排序;

换成less为从大到小排序;

函数用法与queue一样只是多了排序;

//q.top()   返回队列第一个值

// q.swap   交换内容

// emplace 原地构造一个元素并插入队列

本题代码

#include<iostream>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<string.h>
#define ll long long
using namespace std;
const int N=1e5+10;
int n,k,vis[N];
struct node
{
	int x;
	int step;
};
void bfs()
{
	queue<node>q;//相当于创建一个数组包含结构体中的变量 
	node star,now,next;//定义三个结构体 
	memset(vis,0,sizeof(vis));
	star.x=n;//开始的时候农夫在n; 
	star.step=0;//次数为0; 
	vis[star.x]=1;//标记开始的位置走过 
	q.push(star);//把开始的入队 
	while(!q.empty())//如果q非空 
	{
		now=q.front();//now定义为队头,第一次的时候也就是star 
		q.pop();//删除q中队头 ,一定要清空,要不然下一次再要把走的这一步变成当前走的步数就不能用q.pop(); 
		if(now.x==k)//如果此时已经走到了k就输出此时的次数 
		{
			cout<<now.step;
			return ;
		}
		for(int i=0;i<3;i++)
		{
			//bfs模板 
			if(i==0)
			next.x=now.x+1;
			else if(i==1)
			next.x=now.x-1;
			else if(i==2)
			next.x=now.x*2;
			if(next.x>=0&&next.x<N&&vis[next.x]==0)
			{
				vis[next.x]=1;//标记已经走过 
				next.step=now.step+1;//步数加一 
				q.push(next);//将此时的存进q,此时下一步的now就是上一步的next了 
				//有点绕口但是就是用一个queue定义的q来临时存每次的上一步,现在,下一步;
				//因为star,now,next都是结构体不能存多个数,就把他们放进q队列里; 
			}
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);//用cin与cout时这句话提高输入输出的时间; 
	cin>>n>>k;
	bfs();
	return 0;
}

Potions (Hard Version)

你是一个病人,要吃药了,当前健康度为0,然后药都放在路上,每个药都有相应的健康值,吃了就会产生相应的变化。现在你在路的左侧,要从左侧走到另一侧,中途不能出现健康度为负的时候,怎么样才能吃最多的药通过这条路呢?

Input

输入第一行是正整数 nn (1 \leq n \leq 2000001≤n≤200000) — 表示有多少药.

第二行是 n 个整数,a_1a1​, a_2a2​, ... ,a_nan​ (-10^9 \leq a_i \leq 10^9−109≤ai​≤109) 表示这些药的健康值。

Output

输出一个整数,表示你最多能吃多少药。

Example

Input

6
4 -4 1 -3 1 -3

Output

5

Note

在样例中,你吃了4 1 -3 1 -3共5份药,最后健康度为0。

代码:

#include<iostream>
#include<stdio.h>
#include<queue>
#include<algorithm>
#include<algorithm>
using namespace std;

int main()
{
	long long n,x,i;
	cin>>n;
	priority_queue<long long,vector<long long>,greater<long long> >q;
	//优先级队列greater从小到大排列
	//将greater改成less即为从大到小 
	
	long long ans=0,sum=0;
	while(n--)
	{
		cin>>x;
		if(x>=0)
		{
			sum+=x;
			ans++;
		}
		else 
		{
			//x是负数的情况 
			if(x+sum>=0)
			{
				sum+=x;
				ans++;
				q.push(x);
			}
			else if(x+sum<0)//如果当前的值令总和为负数就跟之前存的负数最小的比较 
			{
				if(q.empty())
				continue;
				else if(x>q.top())//如果x比之前存的最小的负数大就换一下,相当于喝当前的x不喝那瓶小的 ,所付出的代价小 
				//注意::负数越大喝下它总和减的越少 
				{
					sum-=q.top();//q.top返回第一个值 
					sum+=x;
					q.pop();//删掉第一个数也就是之前最小的那个 
					q.push(x);//把x存进去    queue自动排序从小到大 
				}
			}
		}
	}
	
	/*
	例如  此时队列中是   -5  -4  -2  -1;
	此时x为-3;总和为2   喝下-3后为-1; 
	
	-3比-5要大  也就是喝-3比喝-5死的慢
	此时 sum=2+5-3 =4;
	这样还能继续喝 
	*/
	cout<<ans<<endl;
	return 0;
}

持续更新....

在MDPI LaTeX模板中添加功能模块,通常涉及对LaTeX类文件(如`mdpi.cls`)或文档中的特定配置进行修改。虽然MDPI模板本身并未提供名为 `potions` 的模块,但可以通过自定义宏包、定义新命令或修改模板源文件来实现类似功能的添加。 若需要添加类似于 `potions` 的模块,可以考虑以下方法: 1. **引入自定义宏包**:在LaTeX文档的导言区(`\documentclass` 和 `\begin{document}` 之间)使用 `\usepackage{}` 命令加载所需的宏包。例如,若 `potions` 涉及图形支持,可添加 `\usepackage{graphicx}` [^1]。 2. **定义新命令**:若 `potions` 指代某种特定功能(如自定义环境、格式化选项等),可以在导言区中使用 `\newcommand` 或 `\newenvironment` 来定义新的命令或环境。例如: ```latex \newcommand{\mycustomcommand}[1]{\textbf{#1}} ``` 上述命令定义了一个新的命令 `\mycustomcommand`,用于将输入文本加粗 [^1]。 3. **修改 `mdpi.cls` 文件**:若需对模板的核心功能进行扩展,可以直接编辑 `mdpi.cls` 文件。例如,可以添加新的条件判断、宏定义或环境配置。需要注意的是,在修改前应备份原始文件,并确保对LaTeX类文件的结构有一定了解 [^1]。 4. **使用 `etoolbox` 进行钩子插入**:如果希望在不直接修改模板文件的情况下注入代码,可以利用 `etoolbox` 宏包提供的钩子机制。例如,在文档开始时插入特定配置: ```latex \usepackage{etoolbox} \AtBeginDocument{ % 在此处添加自定义配置 } ``` 5. **参考MDPI官方文档**:MDPI通常会提供详细的模板说明文档,其中包含如何自定义和扩展模板功能的指导。建议查阅模板附带的 `.pdf` 说明文件,或访问 [MDPI Author Guidelines](https://www.mdpi.com/authors) 获取最新信息 [^1]。 ### 示例代码 以下是一个简单的示例,展示如何在MDPI模板中添加一个自定义命令 `\potions`,用于输出特定格式的内容: ```latex \documentclass[journal,article,submit,moreauthors,pdflatex]{mdpi} \usepackage{etoolbox} % 定义 \potions 命令 \newcommand{\potions}[1]{\textit{Potions: #1}} \begin{document} \section{Introduction} This is an example of using the \texttt{\textbackslash potions} command: \potions{elixir, tincture, draught}. \end{document} ``` 上述代码定义了一个新的命令 `\potions`,它接受一个参数并以斜体格式输出内容 [^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值