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.

输入输出样例

输入样例#1:

3 6 3
3 4
6 2
5 7
8 2
9 2
6 4
5 4
6 7
8 7

输出样例#1:

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,X​i​​,Y​i​​≤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相关推荐

  1. bzoj1605 / P2905 [USACO08OPEN]农场危机Crisis on the Farm

    P2905 [USACO08OPEN]农场危机Crisis on the Farm 发现总步数$k<=30$,考虑用$k$瞎搞 设$f[u][i][j]$表示已经吹$u$次哨,全体奶牛向右走$i ...

  2. P2905 [USACO08OPEN]农场危机Crisis on the Farm(简单dp+麻烦“回溯”)

    惯例,化简题意(看长短决定难度) 一块草坪上有两种点(姑且称为a和b),各有坐标,现在能同时使所有a点向东西南北任意一个方向移动一个单位,若a点与b点重合,则答案增加重合数,求答案的最大值并且求出这个 ...

  3. P2905 [USACO08OPEN]农场危机Crisis on the Farm

    传送门 DP 设 f [ i ] [ j ] [ k ] 表示已经走了 i 步,向上走了 j 步,向右走了 k 步时能拯救的最多奶牛数(j,k可以为负,表示反向) 设 g [ i ] [ j ] 表示 ...

  4. P2905 [USACO08OPEN]农场危机Crisis on the Farm-dp

    dp,阶段就是步数. 本蒟蒻想不出来,只好用题解大法:四个方向的走路,dp的阶段是步数,每个点可以由四个方向转移而来.这是逆序做的.他这样做的好吃是最后回到原点,然后逆序找字典序最小即可. 独立思考下 ...

  5. 洛谷 P2921 在农场万圣节Trick or Treat on the Farm (tarjan求强连通分量)

    洛谷 P2921 在农场万圣节Trick or Treat on the Farm (tarjan求强连通分量) 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N&l ...

  6. 洛谷 P2908 [USACO08OPEN]文字的力量Word Power

    P2908 [USACO08OPEN]文字的力量Word Power 题目描述 Farmer John wants to evaluate the quality of the names of hi ...

  7. 洛谷 P2921 在农场万圣节Trick or Treat on the Farm题解

    题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定 ...

  8. 洛谷[P2921]在农场万圣节

    题目传送门OvO 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100000)N(1<=N<=100000)N(1<=N<=100 ...

  9. 洛谷P3144 [USACO16OPEN]关闭农场Closing the Farm_Silver

    洛谷P3144 [USACO16OPEN]关闭农场Closing the Farm_Silver 题目描述 FJ和他的奶牛们正在计划离开小镇做一次长的旅行,同时FJ想临时地关掉他的农场以节省一些金钱. ...

最新文章

  1. NR 5G 协议层服务和功能
  2. python入门指南bl-Vue 3 高阶指南之 Map
  3. Hadoop系列二:Hadoop单节点伪分布部署并执行mapreduce示例wordcount
  4. HDU 4281 Judges' response [MTSP]
  5. 从Spring开始,Java EE 6必须具备哪些附加功能?
  6. java hashmap 常用方法_Java的HashMap中的常用方法总结
  7. java中的mod运算_Java源码中Integer类位运算分析
  8. 【渝粤教育】国家开放大学2018年春季 0239-22T电子商务物流管理 参考试题
  9. systemctl 管理服务命令
  10. Selenium免密码登录学习的方法
  11. Python实战项目(一)刷网页访问量程序
  12. 图像处理:图像灰度化
  13. 理解并取:frame-relay的工作原理
  14. 漫步数理统计三十一——依分布收敛
  15. 机器人动作编辑器说明
  16. CH340国产USB转异步串口芯片替代CP2102对比CH340C与CH340G
  17. 工具分享(3):使用Java Swing开发圆形/椭圆公章、私章图片(内附源码)
  18. flex水平排列左对齐
  19. 【游戏开发渲染】Unity ShaderGraph使用教程与各种特效案例:Unity2022(持续更新)
  20. 我所理解的高通平台Lcd驱动框架

热门文章

  1. 学习笔记 | 建站流程
  2. Excel的选取和函数常用技巧及快捷键(一)
  3. 大数据:数据仓库设计
  4. Hadoop中怎么解决Starting secondary namenodes [0.0.0.0]
  5. 红绿灯的html代码,红绿灯.html
  6. Docker与微服务实战2022:基础篇
  7. SN74LS148优先编码器的级联使用
  8. 一个barcode 多个 sku号_亚马逊SKU是什么?有什么作用?
  9. 中科院计算机信息暑期学校,中国科学院大学首期“电子信息技术”暑期学校正式开幕...
  10. java开源运维平台_推荐一个:开源自动化运维开发平台(IT Automatic Develop Platform)...