POI2004[MOS] 贪心+DP

---恢复内容开始---

描述

一个夜晚一些旅行者想要过桥. 他们只有一个火把. 火把的亮光最多允许两个旅行者同时过桥. 没有火把或者多于2个人则不能过桥.每个旅行者过桥都需要特定的时间,

两个旅行者同时过桥时时间应该算较慢的那个. 我们想知道所有旅行者最少要花费多少时间才能全部过桥?

Example 假如有4个人. 他们分别需要花费6,7,10,15分钟过桥.下图演示了他们如何使用44分钟全部过桥的,但他们能做得更快么?(没有图)

输入

第一行一个数n 表示旅行者的总数, 1 <= n <= 100,000. 接下来n 行表示所有旅行者的过桥时间,时间从小到大排列,每个数不超过1,000,000,000.

输出

输出一个数表示最少过桥时间.

样例输入[复制]

4
6
7
10
15

样例输出[复制]

42

这道题目好像是相当的神奇,因为我一看到以为是结论题,就是直接第一个人一直跑就行了

结果这么写直接爆0,5555QAQ

这道题有两个最优的方法

1.同我上面那里说的一样,最快的人(第一个)和最慢的人先过去,然后最快的人再回来

2.第二种比较奇葩,第1个人和第2个人过桥,然后1送回火把,让最慢的人和次慢的人过桥,再让2号回来

第一种只能运送1个人,第二种一次能送2个人

我理性分析了一下,强行解释一下:

这道题因为一次限制2个人过去,第一种方法的设计就是尽快让最慢的1个人过去,而第二种因为最慢和次慢同时过去可以比分开过节省一个次慢的时间,这是最重要的,至于为什么用12号来回跑不用说了

为什么一次不送三个人?因为我们一次只能走两个人,利用两个人最慢优化次慢的那个,如果一次过多个人这题tm还能这么简单代码的做?

到这里你会发现我一直在谈论如何过最慢的问题,那么这玩意的dp顺序就是按最慢的来,也就是倒着来(相比较肯定先走慢的容易省更多的时间)

设 f[i] 是从第n个人开始从后往前送,送到了第 i 个人这里了的最短时间

对于第一种情况,到这里花费的总时间肯定是 a[1]+a[i]+f[i+1]

第二种情况到这里花费的总时间肯定是 a[i+1]+a[1]+2*a[2]+f[i+2]

对这个方程做一些解释,a[i+1] 是 i 与 i+1 人一起走花费 a[i+1] 的时间,1号返回一次记一次a[1],12号一起过去花费a[2] , 2号回来花费a[2]时间,总共2倍,f[i+2]也就简单了

代码竟然出人意料的短,输入竟然是有序的233

code:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 long long a[1000005],f[1000005];
 6 int main(){
 7 //    freopen("2072.in","r",stdin);
 8 //    freopen("2072.out","w",stdout);
 9     long long n;cin>>n;
10     long long sum=0;
11     for(long long i=1;i<=n;i++)
12         cin>>a[i];
13     if(n<=2){
14         cout<<a[n];
15         return 0;
16     }
17     f[n]=a[n]+a[1];
18     for(int i=n-1;i>=1;i--)
19         f[i]=min(a[i]+a[1]+f[i+1],a[i+1]+2*a[2]+a[1]+f[i+2]);
20     cout<<f[3]+a[2];
21     return 0;
22 } 

overQAQ

原文地址:https://www.cnblogs.com/saionjisekai/p/9691432.html

时间: 2024-10-28 14:36:28

POI2004[MOS] 贪心+DP的相关文章

URAL 1203 Scientific Conference(贪心 || DP)

Scientific Conference 之前一直在刷计算几何,邀请赛连计算几何的毛都买见着,暑假这一段时间就做多校,补多校的题目,刷一下一直薄弱的DP.多校如果有计算几何一定要干掉-.- 题意:给你N个报告会的开始时间跟结束时间,问你做多可以听几场报告会.要求报告会之间至少间隔为1. 思路:其实是个活动安排问题,可以用贪心也可以用DP,贪心写起来会比较简单一些,因为练习DP,所以又用DP写了一遍. 贪心的话就是一个很简单的活动选择问题,从结束时间入手,找每次的最优选择. 1 struct n

codeforces349B - Color the Fence 贪心+DP

题意:1-9每个字母需要消耗ai升油漆,问你用油漆最多刻意画多大的数字 解题思路: 首先我们要贪心,可以知道我最优是先使我们位数尽可能长,然后才是就是位数长的情况下使得从最高位开始尽可能大.所以要取满足最长位最小的那个数,方便我们DP 解题代码: 1 // File Name: 349b.cpp 2 // Author: darkdream 3 // Created Time: 2014年07月24日 星期四 21时40分13秒 4 5 #include<vector> 6 #include&

HDU 4939 Stupid Tower Defense(贪心+dp)

HDU Stupid Tower Defense 题目链接 题意:有一些塔,红塔能攻击经过他的,绿塔能攻击经过之后的,蓝塔能把经过之后的减速,求在1-n上放塔,求伤害最大值 思路:一开始以为直接贪心,绿塔最前,蓝塔中间,红塔最后就可以了,结果其实是错的 不过,红塔放最后是肯定的,这个很显然就不多证明了,是贪心的思想 然后就dp[i][j]表示放到i,前面有j个绿塔去状态转移即可 代码: #include <cstdio> #include <cstring> #include &l

CF459E Pashmak and Graph【贪心+dp】

题目:CF459E Pashmak and Graph 题意:给出n个点,m条边的图,然后让你每次只能向权值更大边走,求最大的边数.可以走多次 分析:由于点比较多,我们可以先对权值从小到大排序,然后从小的开始,更新它的到的节点的值为前一个节点值+1,但是还会出现权值相等成环的情况,所以我们可以对相等的先不更新,保存起来,等相等的结束了再更新. 代码: #include<cstdio> #include<algorithm> using namespace std; const in

贪心+dp

贪心+dp 好多题都是这个思想, 可以说是非常重要了 思想一: 在不确定序列无法dp的情况下, 我们不妨先假设序列已经选定, 而利用贪心使序列达到最优解, 从而先进行贪心排序, 在进行dp选出序列 思想二: 最优解一定满足上一个状态在某 Problem 1 n 座楼房,立于城中. 第 i 座楼,高度 \(h_i\) . 你需要一开始选择一座楼,开始跳楼.在第 座楼准备跳楼需要 的花费.每次可以跳到任何一个还没有跳过的楼上去.但跳楼是有代价的,每次跳到另外一座楼的代价是两座楼高度的差的绝对值,最后

BZOJ 2072 POI2004 MOS 动态规划+贪心

题目大意:过桥问题 我们考虑利用时间最小的两个人倒运,把时间大的人依次送过去 有两种方式: 1.时间最小的人和时间最大的人过去,然后时间最小的人把火把拿回来 2.时间最小和第二小的两个人过去,然后时间最小的人把火把拿回来:接着时间最大和第二大的两个人过去,时间第二小的人把火把拿回来 为了保证最优 运输应该不外乎这两种形式 那么令f[i]表示当前没有过桥的人还剩i个时的最短时间 DP即可 #include <cstdio> #include <cstring> #include &l

poj 3016 K-Monotonic 左偏树 + 贪心 + dp

//poj 3016 K-Monotonic//分析:与2005年集训队论文黄源河提到的题目类似,给定序列a,求一序列b,b不减,且sigma(abs(ai-bi))最小.//思路:去除左偏树(大根堆)一半的节点(向上取整),让左偏树的根节点上存放中位数:每个左偏树的根节点表示一个等值区间//在本题中,我们将一段区间 与 一颗左偏树等同:将求调整给定数列 vi 为不减序列的代价 与 求取数列 bi 等同 1 #include"iostream" 2 #include"cstd

[BZOJ2072][POI2004] MOS过桥

Description 一个夜晚一些旅行者想要过桥. 他们只有一个火把. 火把的亮光最多允许两个旅行者同时过桥. 没有火把或者多于2个人则不能过桥.每个旅行者过桥都需要特定的时间, 两个旅行者同时过桥时时间应该算较慢的那个. 我们想知道所有旅行者最少要花费多少时间才能全部过桥? Example 假如有4个人. 他们分别需要花费6,7,10,15分钟过桥.下图演示了他们如何使用44分钟全部过桥的,但他们能做得更快么? Input第一行一个数n 表示旅行者的总数, 1 <= n <= 100,00

ZOJ 3689 Digging(贪心+dp)

Digging Time Limit: 2 Seconds      Memory Limit: 65536 KB When it comes to the Maya Civilization, we can quickly remind of a term called the end of the world. It's not difficult to understand why we choose to believe the prophecy (or we just assume i