• 作者: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. RestFul 与 RPC

    原文地址:https://blog.csdn.net/u014590757/article/details/80233901 RPC.REST API深入理解 一:RPC RPC 即远程过程调用(Re ...

  2. 关于父组件通过v-on接收子组件多个参数的一点研究

    写组件的时候遇到一个需求,我需要在子组件向父组件传递信息 this.$emit('myEvent', 信息1, 信息2) 在父组件使用v-on来接收 <my-component @myEvent ...

  3. C++ 之手写strcat

    char *strcat(char* strDest, const char*strSrc){ assert(strDest != NULL&&strSrc != NULL); cha ...

  4. sas教程

    http://web5.pku.edu.cn/pucssr/SASbiancheng.pdf 本教程中的主题将向您介绍 SAS Enterprise Guide.您最好依次浏览这些主题. 概述 启动项 ...

  5. 【Leetcode Top-K问题 BFPRT】第三大的数(414)

    题目 给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是O(n). 示例 1: 输入: [3, 2, 1] 输出: 1 解释: 第三大的数是 1. 示 ...

  6. 阿里云容器Kubernetes监控(九) - Kubernetes事件离线工具kube-eventer正式开源

    前言 监控是保障系统稳定性的重要组成部分,在Kubernetes开源生态中,资源类的监控工具与组件百花齐放.除了社区自己孵化的metrics-server,还有从CNCF毕业的Prometheus等等 ...

  7. python 文件读写编码

  8. CVE-2019-0708漏洞利用

    20190514,微软发布补丁,修复了一个严重的RDP远程代码执行漏洞.该漏洞无需身份认证和用户交互,可能形成蠕虫爆发,影响堪比wannycry. 影响范围: Windows 7 Windows Se ...

  9. 巨蟒python全栈开发-第11阶段 ansible_project1

    今日大纲: 1.前端页面介绍 2.发布流程 3.需求分析 4.表结构设计 5.前端页面设计 昨日内容回顾: 1.roles - tasks - handlers - files - templates ...

  10. Flask学习之五 用户登录

    英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-v-user-logins 中文翻译地址:http:// ...