E. Sheep Eat Wolves

2024-09-01 17:04
文章标签 eat sheep wolves

本文主要是介绍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] minwhile(!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;
}

这篇关于E. Sheep Eat Wolves的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127530

相关文章

HDU 3046Pleasant sheep and big big wolf(网络流之最小割)

题目地址:HDU 3046 最小割第一发!其实也没什么发不发的。。。最小割==最大流。。 入门题,但是第一次入手最小割连入门题都完全没思路。。。sad。。对最小割的本质还是了解的不太清楚。。 这题就是对每两个相邻的格子的边界都要进行加边,然后求最大流就OK了。 RE了好长时间,注意遍历加边的时候要从1开始,而不是0开始,因为0是源点的。。。(也许只有我才犯这种错误吧。。。)建图不多说了。。

uva 10273 - Eat or Not to Eat?(暴力枚举)

题目大意:uva 10273 - Eat or Not to Eat? 题目大意:在一个农场里有n头牛,每头牛都有一个产奶周期,然后n行就是每头牛的产奶周期;然后农场主想要杀一些奶牛来吃,所以每天就把产奶量最小的杀来吃;如果有两只产奶量一样小,那今天就不杀。输出没有杀掉的牛的个数,以及最后杀牛的日子。 解题思路:暴力枚举, 注意说停止的时间,即当前天数 - 上一次吃牛的日子 > t

HDU 2952 Counting Sheep 深搜

题意:给一个h*w的图,求有多少个#块,如果上下左右任意一个连着就被视为一块,有传递性。 想法:标记,深搜。 #include<iostream>#include<cstring>using namespace std;int h,w;char map[120][120];bool mark[120][120];int dir[4][2]={1,0,0,1,-1,0

Codeforces Beta Round #87 (Div. 2) / 116B Little Pigs and Wolves (简单匹配)

http://codeforces.com/problemset/problem/116/B 开始还打算打匈牙利的。。结果看到了这句话: “there will be at most one wolf adjacent to each little pig” 也就是说,对于每头狼,若它周围有猪,就++cnt 因为不会出现两头狼吃同一只猪的情况。 完整代码: /*30ms,

关于js [GDOUCTF 2023]hate eat snake

查看页面源代码 发现snake.js文件 打开js文件 第7行定义了游戏的速度this.speed = this.oldSpeed = speed || 10 ; 全文搜索speed,在第237行发现自增代码this.speed++; 注释或者删除自增代码 回到游戏页面 重玩游戏,等待60s即可 得到flag

LeetCode1553. Minimum Number of Days to Eat N Oranges

文章目录 一、题目二、题解 一、题目 There are n oranges in the kitchen and you decided to eat some of these oranges every day as follows: Eat one orange. If the number of remaining oranges n is divisible by

nyoj232 How to eat more Banana dp

题意是给n种长方体长宽高分别为x,y,z,每种长方体的数量为无限个。 求长方体叠放的最大高度。上面的长方体的长和宽必须小于下面的长和宽,不能等于。 可以任意摆放长方体,也就是每种长方体就有六种情况。 先将长方体按长和宽的降序排好,然后按照最长递增子序列的思路,用dp[]存储当前长方体可以叠加的最大高度。 #include <bits/stdc++.h>using namespace std;

Get All you can eat! achievement ---- Youda Survivor

Youda Survivor 这是一款不错的小游戏,应属于智力类游戏中的策略型。基本玩法是过关得奖励,用奖励去购买或者升级你的机器、仆人以及巫术。你可以操纵主角与螃蟹、秃鹰、海盗等战斗,与海盗战斗要小心你的体力,升级机器时最好考虑预留一定量的体力,否则刚升完就遭遇海盗,你那所剩无几的体力是禁不起折腾的。 过关需要的是策略而不是蛮干,所以,尽可能的去尝试用最少的资源与时间去达成目标。对于追求完美的

导出表(EAT)规则特例

GetLastError( )函数由kernel32.dll库文件导出,用ida打开找到该函数,发现没有汇编代码,只有一段字符串定义(和微软的导出表规则不太一样哦),下图: 再转到ntdll.dll查找RtlGetLastWin32Error( )函数源代码,如下图: 代码解释:获取TEB地址,再获取TEB偏移0x34处的4字节数据返回 查看TEB结构,偏移0x34处LastErro