2020安徽省大学生程序设计大赛题解——K 农夫打狼

K 农夫打狼

题解

标签

排序,动态规划

分析


图K−1本题的一个样例,彩色十字为起点和终点图K-1 \ \ \ \ 本题的一个样例,彩色十字为起点和终点图K−1    本题的一个样例,彩色十字为起点和终点

想要让全程路径长度最短,有一点是毋庸置疑的,那就是农夫在刚到第iii层时,会找到第iii层最左///最右边的狼开始,并按照从左向右///从右向左的顺序杀完该层所有的狼,最后到达第iii层最右///最左边的狼的位置。所以我们把所有点按yyy坐标排序,对于yyy坐标相同的点,求出xxx坐标最小值和最大值。


图K−2在完成一层后,上楼并按照左右顺序走完该楼层图K-2 \ \ \ \ 在完成一层后,上楼并按照左右顺序走完该楼层图K−2    在完成一层后,上楼并按照左右顺序走完该楼层

农夫在杀完第iii层狼后,他的终点坐标一定在第iii层的最左边的狼处或者在最右边的狼处。这既是第iii层的终点,又是第i+1i+1i+1层的起点。

本来我们希望用dp[i]表示杀完前iii层狼所需要的最短路径的,但这样不便处理。基于上述描述,我们可以把动态规划

设dp[i][j]dp[i][j]dp[i][j]表示杀完前iii层的狼,并回到j=0j=0j=0(第iii层最左边)///j=1j=1j=1(第iii层最右边),所需要的最小路程,那么dp[n][n]dp[n][n]dp[n][n]即为所求。

我们再考虑状态转移,这个二维数组的状态转移关系很容易得出,即dp[i−1][0]、dp[i−1][1]dp[i-1][0]、dp[i-1][1]dp[i−1][0]、dp[i−1][1]到dp[i][0]、dp[i][1]dp[i][0]、dp[i][1]dp[i][0]、dp[i][1]的状态转移。

具体的状态转移方程如下,至于是如何得出的,再看完程序后自然能够理解。

dp[i][0] = min(dp[i - 1][0] + abs(maxx[i - 1] - minx[i]), dp[i - 1][1] + abs(maxx[i - 1] - minx[i])) + dis + 1;
dp[i][1] = min(dp[i - 1][0] + abs(minx[i - 1] - maxx[i]), dp[i - 1][1] + abs(maxx[i - 1] - maxx[i])) + dis + 1;

参考答案(C++)

#include<bits/stdc++.h>
using namespace std;struct point {int x, y;point() {}point(int x, int y) {this->x = x;this->y = y;}
}p[100005];bool cmp(point a, point b) {return a.y == b.y ? a.x < b.x : a.y < b.y;
}int dp[100005][2];
int minx[100005], maxx[100005];
int m, n, x, y;int main() {cin >> n >> m;minx[0] = maxx[0] = 0;for (int i = 1; i < n; i++) {maxx[i] = -1;minx[i] = 100005;}minx[n] = maxx[n] = n;for (int i = 0; i < m; i++) {cin >> x >> y;p[i] = point(x, y);}sort(p, p + m, cmp);for (int i = 0; i < m; i++) {minx[p[i].y] = min(minx[p[i].y], p[i].x);maxx[p[i].y] = max(maxx[p[i].y], p[i].x);}for (int i = 1; i <= n; i++) {if (minx[i] == 100005) {minx[i] = minx[i - 1];maxx[i] = maxx[i - 1];}}for (int i = 1; i <= n; i++) {int dis = maxx[i] - minx[i];dp[i][0] = min(dp[i - 1][0] + abs(maxx[i - 1] - minx[i]), dp[i - 1][1] + abs(maxx[i - 1] - minx[i])) + dis + 1;dp[i][1] = min(dp[i - 1][0] + abs(minx[i - 1] - maxx[i]), dp[i - 1][1] + abs(maxx[i - 1] - maxx[i])) + dis + 1;}cout << min(dp[n][0], dp[n][1]) << endl;return 0;
}

2020安徽省大学生程序设计大赛题解——K 农夫打狼相关推荐

  1. 2020安徽省大学生程序设计大赛题解——E 收集圣物

    2020安徽省大学生程序设计大赛题解--E 收集圣物 E 收集圣物 在一个策略游戏中,僧侣单位可以收集圣物,放入修道院中,以生产黄金.因此,圣物对赢得游戏的胜利很重要. 某个僧侣正处于一个长为n 宽为 ...

  2. 2020安徽省大学生程序设计大赛题解——J 飞奔的战士

    2020安徽省大学生程序设计大赛题解--J 飞奔的战士 J 飞奔的战士 题目 众所周知, T e u t o n i c K n i g h t Teutonic Knight TeutonicKni ...

  3. 2020安徽省大学生程序设计大赛题解——A数字排列

    2020安徽省大学生程序设计大赛题解--A数字排列 A 数字排列 给出两个整数A 和 B,可以重新排列A 得到新的数字C(不能有前导0).求在小于等于B的情况下,C的最大值是多少.如果不存在输出-1. ...

  4. 2020安徽省大学生程序设计大赛题解——F 跳蛙出行

    2020安徽省大学生程序设计大赛题解--F 跳蛙出行 F 跳蛙出行 池塘里有n片荷叶排成一行,有一只青蛙在上面跳跃.但是,这只青蛙是只不同寻常的青蛙,它每跳一次,只能从一片荷叶跳到相邻的荷叶上,并且, ...

  5. “Shopee杯” e起来编程暨武汉大学2020年大学生程序设计大赛决赛(重现赛)

    比赛链接 文章目录 A题 A Simple Problem about election 题目描述 题解: 代码: D题 Deploy the medical team 题意: 题解: 代码: F题 ...

  6. 2017年“华信智原杯”安徽省大学生程序设计大赛C题-刷票

    C. 刷票 题目描述: 有一个选秀比赛,节目组按照观众的投票情况决定选手的去留.为了给旗下 艺人造势,A 公司收买了一批水军来刷票.已知现在有 n 名选手同台竞争,依次 编号 1-n,A 公司的艺人编 ...

  7. 2022年安徽省机器人大赛——程序设计赛道 第十三届安徽省大学生程序设计大赛————I 玩捉迷藏

    (建议直接观看后面图片,图片更生动哦) 首先看这个题目,这个题目也是比较简单得,最主要就是读懂这个题目,因为我感觉这个题目还是比较绕人的. 首先我们来分析一下题目,"小明可以使用 Cij个航 ...

  8. 2020 乐山师范学院新生程序设计大赛题解

    2020 乐山师范学院新生程序设计大赛题解 A 数组求和 中等难度 题目大意: 给定一个数组,执行若干次操作,每次操作可以把两个相邻的数变成相反数,求数组最大的和. 解题思路: 这其实是一个思维题,认 ...

  9. 金莹江苏省计算机学会教授,2020年江苏省大学生程序设计大赛在我校举办

    11月15日,2020年江苏省程序设计大赛在河海大学举办.河海大学副校长董增川教授.江苏省计算机学会秘书长金莹教授出席闭幕式并致辞. 河海大学副校长董增川教授在致辞中表示,河海大学不断深化教育教学改革 ...

最新文章

  1. 虎符杯——虚拟机逆向
  2. 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-10底层驱动之I2C
  3. 用计算机语言画曲线,用C语言控制台画简单的曲线
  4. android模拟器后台截屏,【Android】Android模拟器下截屏及格式转换
  5. git常用命令(克隆、分支、tag标签、推送、日志查看,常用命令总结)、将本地代码第一次提交到远程git仓库、过滤掉不提交的内容
  6. 【编译原理】第二章课后习题(王生原版)
  7. 手把手之stacking|分享集成模型在实际工作中的应用(上)
  8. 【简易教程】人体时钟 ホネホネ・クロック [時計・ブログパーツ]
  9. jenkins的安装与使用
  10. javaagent技术专利申请
  11. 简述马尔可夫链【通俗易懂】
  12. leaflet实现风场流动
  13. Centos8.3 nfs-ganesha使用ceph后端
  14. java实训报告结论_Java实验报告(二)及总结
  15. 学机器人编程要学什么知识
  16. 阿龙学堂-算法-逻辑回归
  17. mybatis从入门到精通(刘增辉著)-读书笔记第五章
  18. 当了10年程序员,我开窍了
  19. Software Archeology 软件考古
  20. 【转载】二分图最大匹配的König定理及其证明

热门文章

  1. Spring Security + OAuth2.0
  2. 计算机不能上网 故障分析,电脑不能上网故障排查方法教程
  3. 【今日CV 计算机视觉论文速览 第135期】Mon, 24 Jun 2019
  4. python题目记录(9.25)
  5. c语言修炼内功,助你升级打怪!!
  6. 最新主流大数据技术分类大全(持续更新)
  7. 微信8.0.3测试版来了,TF直装安卓内测也来袭,附地址
  8. vue 汉字转首字母
  9. 0.618法C语言编程,c语言编程题--0.618法求最小值
  10. 四旋翼飞行器2——自己设计四旋翼飞行器的硬件准备和基础知识