E. Sheep Eat Wolves

https://codeforces.com/gym/104869/problem/E

赛时队友想贪心,贪不了一点,我想了数学办法每次都送固定的发现送过去就不满足了

赛后补,暴力做O(n4)

至少要几次才能把安全所有羊送到对岸去

考虑最短路,bfs,用数组存下所有状态

dp[N][N][2]第一维是羊的数量,第二维是狼的数量,第三维是从左边到右,还是从右边到左边,

牧羊人在左边,牧羊人在右边

记录的是左岸的动物状态

暴力写,去除一些不合法状态,状态转移就好了

最后完成任务的状态是min(dp[0][?][1]) 最后一次必然把牧羊人在右边

// Problem: E. Sheep Eat Wolves
// Contest: Codeforces - The 2023 ICPC Asia Shenyang Regional Contest (The 2nd Universal Cup. Stage 13: Shenyang)
// URL: https://codeforces.com/gym/104869/problem/E
// Memory Limit: 512 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
const int N=1e2+9;
struct node{
	int x,y,state;
};
int dp[N][N][2];//x y 0/1   人的位置左岸,右岸
queue<node> Q;
int main(){
	int X,Y,p,q;
	cin>>X>>Y>>p>>q;
	memset(dp,-1,sizeof(dp));//未转移过
	Q.push({X,Y,0});
	dp[X][Y][0]=0;//->dp[0][?][1] min
	while(!Q.empty()){
		auto [x,y,z]=Q.front();
		Q.pop();
		if(!z){//->
			for(int i=0;i<=x;i++){
				for(int j=0;j<=y;j++){
					if(i+j>p){
						continue;
					}
					if((y-j)>(x-i)+q && (x-i)>0){//!x 就都到对岸了,合法
						continue;
					}
					if(dp[x-i][y-j][z^1]!=-1){
						continue;
					}
					dp[x-i][y-j][z^1]=dp[x][y][z]+1;
					Q.push({x-i,y-j,z^1});
				}
			}
		}else{//<-
			for(int i=0;i<=X-x;i++){
				for(int j=0;j<=Y-y;j++){
					if(i+j>p){
						continue;
					}
					if((Y-y-j)>(X-x-i)+q && (X-x-i)>0){
						continue;
					}
					if(dp[x+i][y+j][z^1]!=-1){
						continue;
					}
					dp[x+i][y+j][z^1]=dp[x][y][z]+1;
					Q.push({x+i,y+j,z^1});
				}
			}
		}
	}
	int ans=(1<<30);
	for(int i=0;i<=Y;i++){
		if(dp[0][i][1]!=-1){
			ans=min(ans,dp[0][i][1]);
		}
	}
	if(ans==(1<<30)){
		cout<<-1<<'\n';
	}else{
		cout<<ans<<'\n';	
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Reeds-Shepp曲线是一种具有最小转弯半径的最优路径,用于在平面上连接两个点。它是由Steven M. LaValle在1994年提出的,以Joseph L. Reeds和Laurent E. G. Shepp的名字命名。Reeds-Shepp曲线的特点是可以实现任何转弯角度,并且总路径长度最短。Reeds-Shepp曲线有五种基本类型,分别是R, L, S, RS和LS曲线,其中R表示右转,L表示左转,S表示直行,RS表示右转后直行,LS表示左转后直行。 在MATLAB中,可以使用reedsSheppConnection函数计算两个点之间的Reeds-Shepp曲线。以下是一个示例代码: ``` start = [0 0 0]; goal = [10 10 pi/2]; r = 1; rsPath = reedsSheppConnection(start,goal,r); ``` 其中start和goal是起始点和目标点的坐标和方向,r是机器人的最小转弯半径。reedsSheppConnection函数返回一条Reeds-Shepp曲线,可以使用plot函数将其可视化。 ``` plot(rsPath(:,1), rsPath(:,2), 'k'); axis equal; ``` ### 回答2: reeds-sheep曲线是一种描述生态系统中物种之间相互作用的数学模型。该模型是由英国生态学家C.S.汤普森于1924年提出的,用来研究捕食者和其猎物之间的关系。 reeds-sheep曲线的基本原理是,当猎物数量较小时,捕食者的数量也会随之减少。反之,当猎物数量增加时,捕食者的数量也会相应增加。这种关系被看作是一种自然的平衡状态。当猎物数量更多时,捕食者的食物供应充足,可以容纳更多的个体,导致捕食者密度增加。然而,这种增长过程是有限的,因为捕食者食物来源的增加会导致其繁殖率下降,个体间的竞争也会增加。 随着捕食者数量的增加,猎物数量逐渐减少。当捕食者数量达到一定水平时,猎物数量下降得足够多,捕食者的食物供应开始减少。由于食物不足,捕食者个体之间的竞争加剧,导致捕食者数量下降。最终,猎物数量再次增加,并开始一个新的周期。 reeds-sheep曲线反映了捕食者和猎物之间的动态平衡。它强调了生态系统中物种相互作用的复杂性和多样性。这种关系在自然界中广泛存在,不仅仅适用于羊和食草动物,还适用于其他动物群体和它们的食物链。 通过研究reeds-sheep曲线,我们可以更好地了解捕食者和猎物之间的相互作用以及生态系统的平衡调节机制。这些知识有助于我们更好地保护和管理生态系统,促进生物多样性的维持和可持续发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值