“假舟楫者,非能水也,而绝江河。”这句话说的是,借助渡船的人,不是会游水,却能横渡江河。

会游水的人反而不一定能顺利地横渡江河。由于江面风浪很大,他们必须潜泳渡河。这就必须用到氧气瓶。氧气瓶当然是出题人买的,而出题人没钱,所以只买了一个。这种氧气瓶有两个输出氧气的管道,最多可供两个人同时过河;其中的氧气是无限的。

显然每次应该有两个人过河,再派对岸的一个人把氧气瓶送回来。需要注意的是,已经横渡到对岸的所有队员都可以送回氧气瓶。

现在给定你每个人渡河所需的时间,要你求出,按照以上方案把所有人送到对岸,所需的最短时间。两个人一起过河的时候,所需的时间等于慢的人所用时间。

【输入文件】第一行,一个正整数n。

其余n个正整数,在第2行,相邻两个整数之间用一个空格隔开。

【输出文件】一行1个整数,表示所用的最短时间。

【样例输入】

3

1 3 4

【样例输出】8

【数据规模和约定】

对于20%的数据,n<=10

对于100%的数据,文件中的所有整数<=1000

【题解】

本题非常的奇怪,一拿到题目首先想到的贪心方法就是以1号做中转,每次由1号送一个人到对岸,再从对岸送回氧气瓶。

典型的例子是这组数据: 1 2 9 9

最优的方法是1与2号过去,1号回来,3与4号过去,2号回来,1与2号过去。这个方案花费是16。如果按照原先的方案,花费是22。

但是,绝对的存在反例!

典型的例子是这组数据:1 9 9 9

原先的方案最佳(29),新方案反而差(37)。

经过仔细观察,我们发现一个事实,对岸的人只有两个过河时间最小的人有意义

这里的意义实质上是由两个过河时间最小的人来决定最优解。

假定现在我们现在需要挨个过河,有2+2=4个人;

下标 分别是1 2 i-1 i

有两种方法:

①1号自己把两个人带过去。

1 i(1和i共用氧气筒) 1(1送还氧气筒) 1 i-1(1把i-1送到对岸) 1(再回来准备下一个)

用时为下标为 i 1 i-1 1的时间之和

②1号回来,两个人一起去对岸,2号回来以后再跟1号一起回去。

1 2(1 2一起去对岸) 1(1回来送氧气筒) i i-1(i和i-1自生自灭一起渡河) 2(2回来和1汇合准备下一次)

用时为下标为 2 1 i 2的时间之和

所以记t1=a[1]+a[2]+a[i-1]+a[i];t2=a[2]+a[1]+a[i]+a[2];

sum=sum+min(t1,t2);

接下来分奇偶讨论!

当渡河人数为偶数时,偶数-2=偶数

不妨设n恰好为4时,只需要渡河一次,

按照上诉2种方法,①可行,②扯淡,此时②必然会回到本岸,所以还要回去,sum=sum+a[2]

当渡河人数为奇数时,奇数-2=奇数

当n恰好为3时,就是1 2 3的渡河方法,最快的 1 3(1 3去) 1(回来送氧气筒) 1 2(1 2去)

时间是 3 1 2= a[1]+a[2]+a[3] sum=sum+a[1]+a[2]+a[3];

所以程序就非常简单:

var t1,t2,n,sum,i:longint;
a:array[..]of longint;
procedure qsort(l,r:longint);
var t,i,j,mid:longint;
begin
i:=l; j:=r;
mid:=a[(l+r)div ];
while i<j do
begin
while a[i]<mid do inc(i);
while a[j]>mid do dec(j);
if i<=j then begin
t:=a[i]; a[i]:=a[j]; a[j]:=t;
inc(i);dec(j);
end;
end;
if l<j then qsort(l,j);
if r>i then qsort(i,r);
end;
begin
assign(input,'river.in');
assign(output,'river.out');
reset(input);
rewrite(output);
readln(n);
for i:= to n do read(a[i]);
qsort(,n);
if n mod = then sum:=a[]+a[]+a[]
else sum:=a[];
i:=n;
while i> do begin
t1:=a[]+a[]+a[i]+a[];
t2:=a[i]+a[]+a[i-]+a[];
if t1>t2 then t1:=t2;
sum:=sum+t1;
i:=i-;
end;
writeln(sum);
close(input);
close(output);
end.

【贪心策略】渡河(river)的更多相关文章

  1. LeetCode--Best Time to Buy and Sell Stock (贪心策略 or 动态规划)

    Best Time to Buy and Sell Stock Total Accepted: 14044 Total Submissions: 45572My Submissions Say you ...

  2. poj1328 Radar Installation(贪心 策略要选好)

    https://vjudge.net/problem/POJ-1328 贪心策略选错了恐怕就完了吧.. 一开始单纯地把island排序,然后想从左到右不断更新,其实这是错的...因为空中是个圆弧. 后 ...

  3. 【贪心策略】USACO 越野跑

    问题 H: 越野跑[贪心策略] [题面] 为了能在下一次跑步比赛中有好的发挥,贝茜在一条山路上开始了她的训练.贝茜希望能在每次训练中跑得尽可能远,不过她也知道农场中的一条规定:奶牛独自进山的时间不得超 ...

  4. Poj 1017 Packets(贪心策略)

    一.题目大意: 一个工厂生产的产品用正方形的包裹打包,包裹有相同的高度h和1*1, 2*2, 3*3, 4*4, 5*5, 6*6的尺寸.这些产品经常以产品同样的高度h和6*6的尺寸包袱包装起来运送给 ...

  5. The - Modcrab——使用贪心策略

    一.题目信息 The - Modcrab 简单翻译一下:Vova有生命值h1,每次攻击值为a1,每瓶药水恢复生命值c1;Modcrab有生命值h2,每次攻击值为a2.在每个关卡开始,Vova有两种选择 ...

  6. E - 不爱学习的lyb HDU - 1789(贪心策略)

    众所周知lyb根本不学习.但是期末到了,平时不写作业的他现在有很多作业要做. CUC的老师很严格,每个老师都会给他一个DDL(deadline). 如果lyb在DDL后交作业,老师就会扣他的分. 现在 ...

  7. HDU-1052(贪心策略)

    Tian Ji -- The Horse Racing Problem Description Here is a famous story in Chinese history. "Tha ...

  8. BZOJ 1029: [JSOI2007]建筑抢修【优先队列+贪心策略】

    1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 4810  Solved: 2160[Submit][Statu ...

  9. 51nod1673 树有几多愁 - 贪心策略 + 虚树 + 状压dp

    传送门 题目大意: 给一颗重新编号,叶子节点的值定义为他到根节点编号的最小值,求所有叶子节点值的乘积的最大值. 题目分析: 为什么我觉得这道题最难的是贪心啊..首先要想到 在一条链上,深度大的编号要小 ...

随机推荐

  1. 怎样让oracle实验本在不做实验时性能提升——win7下举例

    怎样让oracle实验本在不做实验时性能提升--win7下举例 型号:ThinkPad E431 系统:WIN7 实验使用的笔记本不使用数据库时.建议将oracle关闭,使其释放占用的资源. orac ...

  2. Android Studio常用快捷键 - 转

    Android Studio常用快捷键 1. Ctrl+D: 集合了复制和粘贴两个操作,如果有选中的部分就复制选中的部分,并在选中部分的后面粘贴出来,如果没有选中的部分,就复制光标所在的行,并在此行的 ...

  3. 20155310《网络对抗》Exp2 后门原理与实践

    20155310<网络对抗>Exp2 后门原理与实践 基础问题回答 1.例举你能想到的一个后门进入到你系统中的可能方式? 在网上下载软件的时候,后门很有可能被捆绑在下载的软件当中: 浏览网 ...

  4. 20155317 十六周second 取值

    20155317 十六周second 取值 题目如下图: secondset #define base 0xFFFFC0000 # #define &clock void setsecond( ...

  5. Web安全基础实践

    Web安全基础实践 标签(空格分隔): <> 目录 基础问题回答 WebGoat下载安装 SQL注入攻击 - SQL字符串注入(String SQL Injection) - 数字型SQL ...

  6. 赚钱的小生意,VC对你没兴趣

    创业者,赚钱的生意就不要去找VC(风险投资)了,因为人家对你的生意没有兴趣. 无论是创业者,VC,股权投资散户,都需要对一个"生意"的规模有个总体的认识. 就"生意&qu ...

  7. SQL Server 常用内置函数

    本文用于收集在运维中经常使用的系统内置(built-in)函数,持续整理中 一,常用Metadata函数 1,查看数据库的ID和Name db_id(‘DB Name’),db_name('DB ID ...

  8. android studio 下载 sdk 失败

    android studio 打开项目出现以下错误时,点击去安装,会提示"All packages are not available for download" 错误. 解决办法 ...

  9. Nginx浅析

    Nginx浅析 Nginx是什么 总的来说,Nginx其实就是一个和apache类似的服务器软件. Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件代理服务器,并在一个BSD-like ...

  10. 《陪孩子像搭积木一样学编程》,一起来玩Scratch(1)使用Scratch编程的基本流程

    编程是一件很有趣的事情.初次接触编程,你可能不知所措,别担心,这并不复杂.首先,为了让读者对编程有大概的了解,可以把编写Scratch程序的过程分成7个步骤(如图1.8).注意,这是理想状态.在实际的 ...