洛谷P2905 [USACO08OPEN]农场危机Crisis on the Farm
P2905 [USACO08OPEN]农场危机Crisis on the Farm
题目描述
约翰和他的奶牛组建了一只乐队“后街奶牛”,现在他们正在牧场里排练.奶牛们分成一堆 一堆,共1000)堆.每一堆里,30只奶牛一只踩在另一只的背上,叠成一座牛塔.牧场 里还有M(1 < M < 1000)个高高的草垛.
作为出色的指挥家,约翰可以通过口哨指挥奶牛们移动.他的口哨有四个音,分别能使所有 的牛塔向东南西北四个方向移动一格.
每一次,当一个牛塔到达了一个草垛所在的格子,牛塔最上方的奶牛就会跳到草垛上,而且 不再下来,而其他奶牛仍然呈塔状站在草垛所在的格子里.当牛塔只剩一只奶牛时,这只奶牛也 会跳到草垛上.
突然,约翰大惊失色:原来邻家的奶缸爆炸了!滚滚而下的牛奶正朝着约翰的牧场冲来,不久就要将牧场淹没.约翰必须马上行动,用口哨声挽救奶牛们的生命.他要指挥奶牛尽量多地跳 上草操,草操上的奶牛将不会被淹死.
约翰还有K次吹口哨的机会.那他最多还能救多少奶牛呢?请计算最多能挽救的奶牛数,以及 达到这个数目约翰需要吹的口哨调子序列.序列用E,W,S,N表示东西南北.如果有多种序列能达到 要求,输出作为字符串最小的.
输入输出格式
输入格式:
Line 1: Three space-separated integers: N, M, and K
Lines 2..N+1: Line i+1 describes the X,Y location of a stack of 30 cows using two space-separated integers: X_i and Y_i
- Lines N+2..N+M+1: Line i+N+1 describes the X,Y location of a haystack using two space-separated integers: X_i and Y_i
输出格式:
Line 1: A single integer that is the most number of cows that can be saved.
- Line 2: K characters, the lexicographically least sequence of commands FJ should issue to maximize the number of cows saved.
输入输出样例
3 6 3 3 4 6 2 5 7 8 2 9 2 6 4 5 4 6 7 8 7
6 EEE
说明
Use the 'east' whistle three times, at which point the milk floods the area. Each haystack ends up saving 1 cow.
对于100%的数据,1\le K\le 30,1\le N,M,X_i,Y_i\le 10001≤K≤30,1≤N,M,Xi,Yi≤1000
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define MAXN 1500 using namespace std; int n,m,K,ans; int dx[4]={1,0,0,-1}; int dy[4]={0,1,-1,0}; char step[40][64][64]; char C[4]={'W','S','N','E'}; int cnt[64][64],f[40][64][64]; //f[k][i][j]记录走k步,纵向移动了i-31步,横向移动了j-31步,所能拯救的最多的牛的数量。 int cawx[MAXN],cawy[MAXN],grassx[MAXN],grassy[MAXN];//记录牛和草垛的横纵坐标. int main(){scanf("%d%d%d",&n,&m,&K);for(int i=1;i<=n;i++)scanf("%d%d",&cawx[i],&cawy[i]);for(int i=1;i<=m;i++)scanf("%d%d",&grassx[i],&grassy[i]);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){int cx=cawx[i]-grassx[j]; //第i头牛移动到第j个草垛,纵向最少所走的距离. int cy=cawy[i]-grassy[j]; //第i头牛移动到第j个草垛,横向最少所走的距离.if(abs(cx)<=30&&abs(cy)<=30)//因为k<=30,所以当有一个方向的距离大于30,就不用考虑了,因为一定不可能走到. cnt[cx+31][cy+31]++; //否则cnt记录走纵向i步横向走j步所能拯救的牛的数量. }for(int k=0;k<=K;k++)for(int i=0;i<=62;i++)for(int j=0;j<=62;j++){f[k][i][j]=-0x3f3f3f3f;step[k][i][j]='Z';}f[0][31][31]=cnt[31][31]; //赋初值,最开始时所能拯救的牛的数量为0. //这里要理解,因为他可以向上下左右走,为了防止负坐标的出现,我们把一开始时的原点坐标当做(31,31).for(int k=1;k<=K;k++)for(int i=1;i<=61;i++)for(int j=1;j<=61;j++)f[k][i][j]=cnt[i][j]+max(max(f[k-1][i-1][j],f[k-1][i+1][j]),max(f[k-1][i][j-1],f[k-1][i][j+1]));//这个状态转移方程就不用解释了,还是很容易理解的. for(int i=1;i<=61;i++)for(int j=1;j<=61;j++)ans=max(ans,f[K][i][j]);for(int i=1;i<=61;i++)for(int j=1;j<=61;j++)if(ans==f[K][i][j])step[K][i][j]='A'; //如果为纵向走i步横向走j步是一种可行的走法,记录以方便求字典序最小. for(int k=K-1;k>=0;k--)for(int i=1;i<=61;i++)for(int j=1;j<=61;j++)for(int l=0;l<4;l++)if(f[k][i][j]+cnt[i+dx[l]][j+dy[l]]==f[k+1][i+dx[l]][j+dy[l]]&&step[k+1][i+dx[l]][j+dy[l]]<'Z')step[k][i][j]=C[l]; //倒序找出所有可能的走法. cout<<ans<<endl;int i=31,j=31;for(int k=0;k<K;k++){cout<<step[k][i][j];if(step[k][i][j]=='E') i--; //找字典序最小的. else if(step[k][i][j]=='W') i++;else if(step[k][i][j]=='S') j++;else if(step[k][i][j]=='N') j--; } }
转载于:https://www.cnblogs.com/thmyl/p/7526666.html
洛谷P2905 [USACO08OPEN]农场危机Crisis on the Farm相关推荐
- bzoj1605 / P2905 [USACO08OPEN]农场危机Crisis on the Farm
P2905 [USACO08OPEN]农场危机Crisis on the Farm 发现总步数$k<=30$,考虑用$k$瞎搞 设$f[u][i][j]$表示已经吹$u$次哨,全体奶牛向右走$i ...
- P2905 [USACO08OPEN]农场危机Crisis on the Farm(简单dp+麻烦“回溯”)
惯例,化简题意(看长短决定难度) 一块草坪上有两种点(姑且称为a和b),各有坐标,现在能同时使所有a点向东西南北任意一个方向移动一个单位,若a点与b点重合,则答案增加重合数,求答案的最大值并且求出这个 ...
- P2905 [USACO08OPEN]农场危机Crisis on the Farm
传送门 DP 设 f [ i ] [ j ] [ k ] 表示已经走了 i 步,向上走了 j 步,向右走了 k 步时能拯救的最多奶牛数(j,k可以为负,表示反向) 设 g [ i ] [ j ] 表示 ...
- P2905 [USACO08OPEN]农场危机Crisis on the Farm-dp
dp,阶段就是步数. 本蒟蒻想不出来,只好用题解大法:四个方向的走路,dp的阶段是步数,每个点可以由四个方向转移而来.这是逆序做的.他这样做的好吃是最后回到原点,然后逆序找字典序最小即可. 独立思考下 ...
- 洛谷 P2921 在农场万圣节Trick or Treat on the Farm (tarjan求强连通分量)
洛谷 P2921 在农场万圣节Trick or Treat on the Farm (tarjan求强连通分量) 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N&l ...
- 洛谷 P2908 [USACO08OPEN]文字的力量Word Power
P2908 [USACO08OPEN]文字的力量Word Power 题目描述 Farmer John wants to evaluate the quality of the names of hi ...
- 洛谷 P2921 在农场万圣节Trick or Treat on the Farm题解
题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定 ...
- 洛谷[P2921]在农场万圣节
题目传送门OvO 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100000)N(1<=N<=100000)N(1<=N<=100 ...
- 洛谷P3144 [USACO16OPEN]关闭农场Closing the Farm_Silver
洛谷P3144 [USACO16OPEN]关闭农场Closing the Farm_Silver 题目描述 FJ和他的奶牛们正在计划离开小镇做一次长的旅行,同时FJ想临时地关掉他的农场以节省一些金钱. ...
最新文章
- NR 5G 协议层服务和功能
- python入门指南bl-Vue 3 高阶指南之 Map
- Hadoop系列二:Hadoop单节点伪分布部署并执行mapreduce示例wordcount
- HDU 4281 Judges' response [MTSP]
- 从Spring开始,Java EE 6必须具备哪些附加功能?
- java hashmap 常用方法_Java的HashMap中的常用方法总结
- java中的mod运算_Java源码中Integer类位运算分析
- 【渝粤教育】国家开放大学2018年春季 0239-22T电子商务物流管理 参考试题
- systemctl 管理服务命令
- Selenium免密码登录学习的方法
- Python实战项目(一)刷网页访问量程序
- 图像处理:图像灰度化
- 理解并取:frame-relay的工作原理
- 漫步数理统计三十一——依分布收敛
- 机器人动作编辑器说明
- CH340国产USB转异步串口芯片替代CP2102对比CH340C与CH340G
- 工具分享(3):使用Java Swing开发圆形/椭圆公章、私章图片(内附源码)
- flex水平排列左对齐
- 【游戏开发渲染】Unity ShaderGraph使用教程与各种特效案例:Unity2022(持续更新)
- 我所理解的高通平台Lcd驱动框架
热门文章
- 学习笔记 | 建站流程
- Excel的选取和函数常用技巧及快捷键(一)
- 大数据:数据仓库设计
- Hadoop中怎么解决Starting secondary namenodes [0.0.0.0]
- 红绿灯的html代码,红绿灯.html
- Docker与微服务实战2022:基础篇
- SN74LS148优先编码器的级联使用
- 一个barcode 多个 sku号_亚马逊SKU是什么?有什么作用?
- 中科院计算机信息暑期学校,中国科学院大学首期“电子信息技术”暑期学校正式开幕...
- java开源运维平台_推荐一个:开源自动化运维开发平台(IT Automatic Develop Platform)...