【题解】p1809 过河问题
题目分析
现有n个人在东岸,要过河去西岸。开始东岸有一艘船,船最多可承载2人,过河时间以耗时最长的人所需时间为准。
给定n个人的过河时间a,求所有人从东岸到西岸所需的最短时间。
当\(n=2\)时,易得答案为\(a[2]\)。但问题在于当\(n>2\)如何解决。
贪心分析
对所有数据从小到大排序。
从小规模数据出发,当\(n=3\)时,不难想到可以先用\(a[1]\)将\(a[3]\)送过去,再让\(a[1]\)回来,这样就回归了\(n=2\)的情况。
\(n>3\)时情况略为复杂,我们考虑推导问题的几个简单性质。
对于每次船在西岸时,如果需要某个人将船送回来,则优先让西岸a最小的\(dalao\)回来。
证明:假设西岸有过河时间\(a[1],a[2],a[3]\)的三个人,则让\(a[1]\)回来,必然导致东岸后续的子问题最优。
如此便得到一个简单的贪心,我们便无需考虑回来的情况,只需要思考如何将人送过去。
重要推论:在问题结束前,不甘寂寞的\(dalao\) \(a[1]\)不可能被留在西岸。也就是说,\(a[1]\)只要过去,就必然要将船送回来。
对于\(4<=i<=n\)的所有\(a[i-1]\),它到西岸只有两种可能方式:自己和\(a[1]\)过去,或者自己和\(a[i]\)过去。
对于第一种方式:就相当于\(a[i-1]\)自己过去,\(a[1]\)负责送船回来,代价\(a[i-1]+a[1]\)。
对于第二种方式:如果不希望\(a[i-1]\)被贡献到答案中,则只能选择一个\(j>i-1\)的小蒟蒻\(a[j]\)来当\(a[i-1]\)的拖油瓶。
但问题在于,过弱的蒟蒻\(a[j]\)不能和\(dalao\) \(a[i-1]\)玩,或者说\(dalao\) \(a[i-1]\)不能选择太弱的\(a[j]\)来当拖油瓶,否则代价会过大。因此\(a[i-1]\)只能选择\(a[i]\)来当它的拖油瓶。
那么两人过去以后,谁给他们送船回来呢?由于\(a[1]\)不可能在西岸等着他们,因此需要提前让\(a[1]\)带\(a[2]\)过去,留\(a[2]\)为他们送船。代价\(a[2]+a[1]+a[i]+a[2]\)。
由此,我们可以得到状态转移方程:$$f[i]=min(f[i-1]+a[i]+a[1],f[i-2]+a[2]+a[1]+a[i]+a[2])$$
几乎每一篇题解都提到了这个方程,那么问题来了,为什么\(f[i]\)由\(f[i-1]和f[i-2]\)中取一转移即可,而不能继续考虑到\(f[i-3]\)?
我们考虑已知\(f[i-3]\),然后新来了三个蒟蒻,对于\(a[i-2]\),他不可能会带\(a[i]\)过河,也就是要么自己走,要么带\(a[i-1]\)走。也就是说\(a[i-2]\)的决策与\(a[i]\)无关。
因此求\(f[i]\)时,只要考虑\(a[i-1]\)的决策即可,也就是从\(f[i-1]\)和\(f[i-2]\)两个状态中取一转移即可。
code:
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=100010;
int n,a[MAXN],f[MAXN];
int main()
{
// freopen("in.txt","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d",a+i);
f[1]=a[1];
f[2]=a[2];
f[3]=a[3]+a[1]+a[2];
for(int i=4;i<=n;++i)f[i]=min(f[i-1]+a[i]+a[1],f[i-2]+a[2]+a[1]+a[i]+a[2]);
printf("%d\n",f[n]);
return 0;
}
【题解】p1809 过河问题的更多相关文章
- 贪心—— P1809 过河问题_NOI导刊2011提高(01)
洛谷——P1809 过河问题_NOI导刊2011提高(01) 题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能 ...
- 洛谷 P1809 过河问题 题解
题面 这道题是一道贪心+DP的好题: 首先排序是一定要干的事情. 然后我们分情况处理: 1.如果剩一个人,让最小的回来接他 2.如果剩两个人,让最小的回来接,剩下的那两个人(即最大的两个人)过去,让次 ...
- 【P1809 过河问题】题解
贪心,我们设时间序列为 \(\{a_i\}\),长度为 \(n\)(先排序 \(\{a_i\}\)). 分类讨论(其中的「\(1\)」「\(2\)」等均指「速度第 \(1\) 人」「速度第 \(2\) ...
- 洛谷P1809 过河问题 经典贪心问题
作者:zifeiy 标签:贪心 题目链接:https://www.luogu.org/problem/P1809 我们假设第 \(i\) 个人过河的耗时是 \(t[i]\) ,并且 \(t[i]\) ...
- 洛谷P1809 过河问题_NOI导刊2011提高(01)
To 洛谷.1809 过河问题 题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时 ...
- luogu P1809 过河问题_NOI导刊2011提高(01)
题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时间T,船划到对岸的时间等于船上渡 ...
- P1809 过河问题_NOI导刊2011提高(01)
题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时间T,船划到对岸的时间等于船上渡 ...
- [Codeforces]#179 div1-----295ABCDE
摘自我的github:https://github.com/Anoxxx The Solution Source: Codeforces Round #179 (Div. 1) VJudge链接: h ...
- luoguP1502过河题解
日常吐(fei)嘈(hua) 这道题作为最近卡了我3天的dp题(最后还是在题解的帮助下冥思苦想才过掉的题),窝觉得此题肥肠之脑洞,写此博客纪念 题解 过河 先来日常手玩样例: 咦感觉怎么手玩答案都像是 ...
随机推荐
- 【JUC系列】01、之大话并发
学习方法 学习技术的方法都很类似,大部分都有着类似的步骤: 场景 需求 解决方案 应用 原理 并发的目的 充分利用CPU 和 I/O资源 提高效率 并发的维度 分工 同步/协作 互斥 分工 线程池 f ...
- 解决intellij idea卡顿的方法
使用idea越用越卡,即使是16G内存也是卡,多开几个微服务卡死了!! 解决方案 参考网路资源整理如下几条 1. 卸载不需要用的插件 我是Java开发,对于一些默认安装的什么安卓的google的app ...
- nginx下如何l在网站目录的二级目录下url重写的方法
以我新项目为例子,该项目要求用laravel来做,因此我把整个项目丢到一个叫laravel的文件夹里面了,目录就变成c:/nginx/html/laravel了,然后发现只能通过localhost/l ...
- 《Java并发编程的艺术》第10章 Executor框架
Java的线程既是工作单元,也是执行机制.从JDK5开始,把工作单元与执行机制分离开来.工作单元包括Runnable和Callable,执行机制由Executor框架提供. 10.1 Executor ...
- Python进阶——详解元类,metaclass的原理和用法
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题第18篇文章,我们来继续聊聊Python当中的元类. 在上上篇文章当中我们介绍了type元类的用法,在上一篇文章当中我 ...
- Java学习笔记6(集合类)
集合类 集合按照其存储结构可以分为两大类,即单列集合Collection和双列集合Map. Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,有List和Set两个重要子接口 ...
- Charles 功能详解
Charles的功能有? 1 抓取http和https 网络封包(抓包) 2 Charles 的断点请求 通过断点修改参数 在指定接口打上断点 右键点击接口选择 breakpoints 然后 导航栏 ...
- .NET Core请求控制器Action方法正确匹配,但为何404?
前言 有些时候我们会发现方法名称都正确匹配,但就是找不到对应请求接口,所以本文我们来深入了解下何时会出现接口请求404的情况. 匹配控制器Action方法(404) 首先我们创建一个web api应用 ...
- SQL注入之sqlmap进阶
上一篇我们对sqlmap进行简单的介绍,并介绍了一些·sqlmap的基础用法,这篇让我们来更深入的了解一下sqlmap,了解一下它的强大功能. 探测等级 参数为 --level 在sqlmap中一共有 ...
- PHP开发环境搭建工具有哪些?
对于php开发小白来说搭建一个php运行环境就是一道坎! 因为要做php开发,搭建一个能够运行php网站的服务器环境是第一步,传统的php环境软件非常复杂,好在很多公司开发了一键搭建php安装环境,一 ...