1605: [Usaco2008 Open]Crisis on the Farm 牧场危机

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 288  Solved: 95
[Submit][Status][Discuss]

Description

约翰和他的奶牛组建了一只乐队“后街奶牛”,现在他们正在牧场里排练.奶牛们分成一堆一堆,共N(1≤N≤1000)堆.每一堆里,30只奶牛一只踩在另一只的背上,叠成一座牛塔.牧场里还有M(1≤M≤1000)个高高的草垛. 作为出色的指挥家,约翰可以通过口哨指挥奶牛们移动.他的口哨有四个音,分别能使所有的牛塔向东南西北四个方向移动一格.
    每一次,当一个牛塔到达了一个草垛所在的格子,牛塔最上方的奶牛就会跳到草垛上,而且不再下来,而其他奶牛仍然呈塔状站在草垛所在的格子里.当牛塔只剩一只奶牛时,这只奶牛也会跳到草垛上. 突然,约翰大惊失色:原来邻家的奶缸爆炸了!滚滚而下的牛奶正朝着约翰的牧场冲来,不久就要将牧场淹没.约翰必须马上行动,用口哨声挽救奶牛们的生命.他要指挥奶牛尽量多地跳上草垛,草垛上的奶牛将不会被淹死.    约翰还有K次吹口哨的机会.那他最多还能救多少奶牛呢?请计算最多能挽救的奶牛数,以及达到这个数目约翰需要吹的口哨调子序列.序列用E,W,S,N表示东西南北.如果有多种序列能达到
要求,输出作为字符串最小的.

Input

第1行输入三个整数N,M,K,之后N行每行输入一对整数(Xi,Yi)表示一座牛塔所在的位置,1<=K<=30
之后M行每行输入一对整数(Xi,Yi)表示一个草垛所在的位置.1≤Xi≤1000;1≤Yi≤1000.

Output

    第1行输出最多能挽救的奶牛数.第2行输出口哨调子序列.

Sample Input

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

Sample Output

Use the 'east' whistle three times, at which point the milk floods
the area. Each haystack ends up saving 1 cow.

6
EEE

这题做得实在是。。。。(省略1E9呵呵)
思路嘛就是dp..f[k][i][j]代表吹k下x轴移动i-k,y轴移动j-k的最佳状态,转移不是很难。。
But!!!!!!!!!!!!!!!!
这些牛的位置可以到任意小于0的点或者是大于一千哈哈哈哈哈哈
然后由于我是边做边转移解的状态。。忽略了第一次吹哨,且没拯救牛的情况。。。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;

const int maxn = 80;
const int dx[4] = {1,0,-1,0};
const int dy[4] = {0,1,0,-1};
const char d[4] = {'W','S','E','N'};

struct W{
char a[maxn];
bool operator < (const W &b) const{
for (int l = 1; l <= maxn; l++)
{
if (a[l] < b.a[l]) return true;
if (a[l] > b.a[l]) return false;
}
}
}w[maxn][maxn][maxn];

struct C{
int x,y;
}cow[1010];

int f[maxn][maxn][maxn],Map[1010][1010],n,m,k,i,j,cnt[maxn][maxn];
bool vis[maxn][maxn][maxn];

int main()
{
//freopen("yzy.txt","r",stdin);
cin >> n >> m >> k;
memset(Map,0,sizeof(Map));
memset(f,0,sizeof(f));
memset(vis,false,sizeof(vis));
for (i = 1; i <= n; i++) scanf("%d%d",&cow[i].x,&cow[i].y);
for (i = 1; i <= m; i++) 
{
int x,y;
scanf("%d%d",&x,&y);
Map[x][y] = 1;
}
for (int l = 1; l <= n; l++)
 for (i = 0; i <= 2*k; i++)
   for (j = 0; j <= 2*k; j++)
   {
      int xx = cow[l].x + i - k;
      int yy = cow[l].y + j - k;
      if (xx < 0 || xx > 1000 || yy < 0 || yy > 1000) 
{
  continue;
}
      cnt[i][j] += Map[xx][yy];
   }
f[0][k][k] = 0;
vis[0][k][k] = true;
for (int l = 1; l <= k; l++)
 for (i = 0; i <= 2*k; i++)
   for (j = 0; j <= 2*k; j++)
     for (int L = 0; L < 4; L++)
     {
      int xx = i + dx[L];
      int yy = j + dy[L];
      if (xx < 0 || xx > 2*k || yy < 0 || yy > 2*k || !vis[l-1][xx][yy]) continue;
      vis[l][i][j] = true;
      if (f[l][i][j] < f[l-1][xx][yy] + cnt[i][j])
      {
      f[l][i][j] = f[l-1][xx][yy] + cnt[i][j];
      w[l][i][j] = w[l-1][xx][yy];
      w[l][i][j].a[l] = d[L];
      }
      else
      if (f[l][i][j] == f[l-1][xx][yy] + cnt[i][j])
      {
      W K;
      K = w[l-1][xx][yy];
      K.a[l] = d[L];
      if (K < w[l][i][j] || f[l][i][j] == 0) w[l][i][j] = K;
      }
     }
int ans = -1,I,J;
  for (i = 0; i <= 2*k; i++)
 for (j = 0; j <= 2*k; j++)
   if (f[k][i][j] > ans)
   {
    ans = f[k][i][j];
    I = i; J = j;
   }
   else 
if (f[k][i][j] == ans)
   {
    if (w[k][i][j] < w[k][I][J])
    {
    I = i;J = j;
    }
   }
printf("%d\n",ans);
for (i = 1; i <= k; i++) cout << w[k][I][J].a[i];
return 0;
}

[Usaco2008 Open]Crisis on the Farm 牧场危机相关推荐

  1. bzoj 1605: [Usaco2008 Open]Crisis on the Farm 牧场危机(DP)

    1605: [Usaco2008 Open]Crisis on the Farm 牧场危机 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 403  S ...

  2. bzoj1605 洛谷2905 [Usaco2008 Open]Crisis on the Farm 牧场危机(DP)

    很暴力的一个题 这个题目大概分为以下几步 一.计算从原点走多少步产生的贡献 曼哈顿距离搞一搞 二.进行DP求最大值 按照字典序贪心的按WSNE进行DP,取最后一个 三.检查合格的终止点 便利一遍DP数 ...

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

    P2905 [USACO08OPEN]农场危机Crisis on the Farm 题目描述 约翰和他的奶牛组建了一只乐队"后街奶牛",现在他们正在牧场里排练.奶牛们分成一堆 一堆 ...

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

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

  5. 1621: [Usaco2008 Open]Roads Around The Farm分岔路口(记忆化搜索)

    1621: [Usaco2008 Open]Roads Around The Farm分岔路口 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 883   ...

  6. How to fix the global rice crisis 如何应对全球稻米危机 | 经济学人20230401版双语精翻

    文 / 柳下婴(微信公众号:王不留) 4月1日<经济学人>周报封面即社论区(Leaders)精选文章:<如何应对全球稻米危机>(How to fix the global ri ...

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

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

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

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

  9. 《告别失控:软件开发团队管理必读》一一1.2 成功的程序设计经理为什么难当...

    本节书摘来自异步社区出版社<告别失控:软件开发团队管理必读>一书中的第1章,第1.2节,作者: [美]Mickey W. Mantle(米奇 W.蒙托) , Ron Lichty(罗恩•利 ...

最新文章

  1. 华为链路汇聚命令(静态)
  2. Java常见内存溢出异常分析
  3. 丁钧:移动,未来的王
  4. Logstash配置语法及相关命令
  5. html:(29):伪选择符和分组选择符
  6. 【APIO2009-3】抢掠计划
  7. 【车道线检测】基于matlab Hough变换视频车道线检测 【含Matlab源码 274期】
  8. 讯飞语音转写json结果格式化,提取文字(基于python)
  9. 最简单的视频编码器:基于libx265(编码YUV为H.265)
  10. 自注意力中的不同的掩码介绍以及他们是如何工作的?
  11. 干货教程:如何把一张照片用PS做成漫画风格(附最新视频教程)
  12. 华厦眼科上市:募资31亿市值393亿 挂靠厦门大学
  13. 搭建自己的dns服务器
  14. 诺基亚如何利用计算机上网,诺基亚S60怎么通过笔记本的WIFI上网?
  15. 如何成为一名合格的程序员?
  16. mysql怎样添加唯一标识_MySql设置唯一标识,主键等设置
  17. android手机桌面怎么调,安卓手机如何修改手机桌面上的CMCC
  18. 手拉手微商俱乐部 微信营销实战课程开讲啦
  19. Eolink x CSDN|战略合作,共建API全生命周期开发生态
  20. 三年级下册我想发明的机器人_3年级我想发明的机器人作文300字(共5篇)

热门文章

  1. 老调重弹,Android Studio 打包H5项目(2020版)
  2. 华为董事会名单大曝光:孙亚芳任正非等13名董事
  3. 蚂蚁金服若IPO 信贷业务或将得到长远发展
  4. 关于微信公众号调起支付
  5. android入门整理
  6. 【子桓说】西安女硕士:我挺感谢新媒体的
  7. Praat脚本-022 | 提取时长和音强
  8. [iOS]上传图片和音视频到阿里云
  9. 信息学奥赛一本通1278:复制书稿(evd)
  10. php curl couldnt connect to host,linux curl命令:curl: (7) couldn't connect to host ?