• 作者:zifeiy
  • 标签:贪心

题目链接:https://www.luogu.org/problem/P1809

我们假设第 \(i\) 个人过河的耗时是 \(t[i]\) ,并且 \(t[i]\) 按照从小到大进行了排序(即: \(t[i] \le t[i+1]\) ), 并且设状态 \(f[i]\) 表示前 \(i\) 个人过河的最小花费。

此处我们的贪心基于这样一种思想:优先令 \(t[i]\) 大的过河。

那么:

当 \(i = 1\) 时,只有一个人,所以此时 \(f[1] = t[1]\) ;

当 \(i = 2\) 时,只有两个人,所以此时 \(f[2] = t[2]\) ;

当 \(i = 3\) 时,我们可以选择第1个人陪第2个人过去,再回来接第3个人;或者第1个人陪第3个人过去,再回来接第2个人,两种情况下都满足 \(f[3] = t[2] + t[1] + t[3]\) ;

当 \(i \gt 3\) 时,我们要送走第 \(i\) 个人,有两种方式:

  • 方式一:第1个人和第i个人过河,第1个人再回来,此时 \(f[i] = f[i-1] + t[i] + t[1]\) ;
  • 方式二:第1个人和第2个人过河,第2个人再回来,第i-1个人和第i个人过来,第1个人再回来(或者:第1个人和第2个人过河,第1个人再回来,第i-1个人和第i个人多来,第2个人再回来),此时状态变化到了 \(f[i-2]\) ,此时 \(f[i] = f[i-2] + t[2] + t[2] + t[i] + t[1]\) 。

所以,当 \(i \gt 3\) 时, \(f[i] = \max(f[i-1] + t[i] + t[1] , f[i-2] + t[2] + t[2] + t[i] + t[1])\) 。

其实我们可以发现,对于任意一个 \(f[i]\) ,它的状态都是由 \(f[j] (j \gt i)\) 演变过来的,但是我们可以通过先求解 \(f[i]\) ,推导出 \(f[j]\) ,最终获得我们的答案—— \(f[n]\) 。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int n, t[maxn], f[maxn];
int main() {
cin >> n;
for (int i = 1; i <= n; i ++) cin >> t[i];
sort(t+1, t+1+n);
for (int i = 1; i <= n; i ++) {
if (i == 1) f[i] = t[i];
else if (i == 2) f[i] = t[2];
else if (i == 3) f[i] = t[2] + t[1] + t[3];
else f[i] = min(f[i-1]+t[i]+t[1], f[i-2]+t[2]+t[2]+t[i]+t[1]);
}
cout << f[n] << endl;
return 0;
}

洛谷P1809 过河问题 经典贪心问题的更多相关文章

  1. 洛谷P1809 过河问题_NOI导刊2011提高(01)

    To 洛谷.1809 过河问题 题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时 ...

  2. 洛谷 P1809 过河问题 题解

    题面 这道题是一道贪心+DP的好题: 首先排序是一定要干的事情. 然后我们分情况处理: 1.如果剩一个人,让最小的回来接他 2.如果剩两个人,让最小的回来接,剩下的那两个人(即最大的两个人)过去,让次 ...

  3. 洛谷 P1002过河卒

    洛谷 P1002过河卒 题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点 ...

  4. 洛谷p1052过河 路径压缩+dp

    洛谷 P1052 过河 思路部分可以看这篇博客 我将在这里对其进行一些解释与补充 首先我们先看题 乍一看 这不是模板题吗 然后开开心心的敲了一个简单dp上去 #include<iostream& ...

  5. 【洛谷 P1667】 数列 (贪心)

    题目链接 对于一个区间\([x,y]\),设这个区间的总和为\(S\) 那么我们在前缀和(设为\(sum[i]\))的意义上考虑到原操作其实就是\(sum[x−1]+=S\) , \(sum[x]+S ...

  6. 洛谷1417 烹调方案 dp 贪心

    洛谷 1417 dp 传送门 挺有趣的一道dp题目,看上去接近于0/1背包,但是考虑到取每个点时间不同会对最后结果产生影响,因此需要进行预处理 对于物品x和物品y,当时间为p时,先加x后加y的收益为 ...

  7. 洛谷P1052 过河

    P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上. 由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青 ...

  8. 洛谷P1002——过河卒

    又是洛谷题,要不是有小姐姐不会,我才不想动脑子.先贴一下题目地址https://www.luogu.org/problem/P1002 再贴一下题目: 我们读一下题目,这可不比学校的**算法题,读完一 ...

  9. 洛谷 P1052 过河

    题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...

随机推荐

  1. Python使用Pandas高效处理测试数据

    转自:https://www.cnblogs.com/keyou1/p/10948796.html 一.思考 1.Pandas是什么? 功能极其强大的数据分析库 可以高效地操作各种数据集 csv格式的 ...

  2. 我从HTML的meta中学到了什么

    meta meta中有这样几个常用属性:http-equiv,name,content,包括html5新增的charset. 注意:content属性用来存储meta信息的内容,所有的主流浏览器都支持 ...

  3. python 正则表达式常用操作符

  4. JS设计模式之单例模式(一)

    单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这 就确保了一个类只有一个实例对象. 在JavaScript里,实现单例的方式有很多种, ...

  5. Oracle存储过程小解

    Oracle存储过程小解 1.创建语法 create or replace procedure pro_name( paramIn in type, paramOUt out type, paramI ...

  6. Silverlight 2.5D RPG游戏技巧与特效处理:(五)HLSL渲染动画

    原文:Silverlight 2.5D RPG游戏技巧与特效处理:(五)HLSL渲染动画 或许大家依旧对上一节中的“黑夜”及“梦回过去”记忆犹新,追问下去HLSL到底是何方神圣能实现如此炫酷之效果?层 ...

  7. jQuery圆盘抽奖

    在线演示 本地下载

  8. oracle-ORA-01650错误

    Unable to extend rollback segment 原因:没有足够的撤销空间用来处理所有活动事务

  9. 2019-8-31-C#-通过-probing-指定-dll-寻找文件夹

    title author date CreateTime categories C# 通过 probing 指定 dll 寻找文件夹 lindexi 2019-08-31 16:55:58 +0800 ...

  10. Java练习 SDUT-2445_小学数学

    小学数学 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 今年中秋节,大宝哥带着一盒月饼去看望小学数学老师.碰巧数学老师 ...