【贪心策略】渡河(river)
“假舟楫者,非能水也,而绝江河。”这句话说的是,借助渡船的人,不是会游水,却能横渡江河。
会游水的人反而不一定能顺利地横渡江河。由于江面风浪很大,他们必须潜泳渡河。这就必须用到氧气瓶。氧气瓶当然是出题人买的,而出题人没钱,所以只买了一个。这种氧气瓶有两个输出氧气的管道,最多可供两个人同时过河;其中的氧气是无限的。
显然每次应该有两个人过河,再派对岸的一个人把氧气瓶送回来。需要注意的是,已经横渡到对岸的所有队员都可以送回氧气瓶。
现在给定你每个人渡河所需的时间,要你求出,按照以上方案把所有人送到对岸,所需的最短时间。两个人一起过河的时候,所需的时间等于慢的人所用时间。
【输入文件】第一行,一个正整数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)的更多相关文章
- 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 ...
- poj1328 Radar Installation(贪心 策略要选好)
https://vjudge.net/problem/POJ-1328 贪心策略选错了恐怕就完了吧.. 一开始单纯地把island排序,然后想从左到右不断更新,其实这是错的...因为空中是个圆弧. 后 ...
- 【贪心策略】USACO 越野跑
问题 H: 越野跑[贪心策略] [题面] 为了能在下一次跑步比赛中有好的发挥,贝茜在一条山路上开始了她的训练.贝茜希望能在每次训练中跑得尽可能远,不过她也知道农场中的一条规定:奶牛独自进山的时间不得超 ...
- Poj 1017 Packets(贪心策略)
一.题目大意: 一个工厂生产的产品用正方形的包裹打包,包裹有相同的高度h和1*1, 2*2, 3*3, 4*4, 5*5, 6*6的尺寸.这些产品经常以产品同样的高度h和6*6的尺寸包袱包装起来运送给 ...
- The - Modcrab——使用贪心策略
一.题目信息 The - Modcrab 简单翻译一下:Vova有生命值h1,每次攻击值为a1,每瓶药水恢复生命值c1;Modcrab有生命值h2,每次攻击值为a2.在每个关卡开始,Vova有两种选择 ...
- E - 不爱学习的lyb HDU - 1789(贪心策略)
众所周知lyb根本不学习.但是期末到了,平时不写作业的他现在有很多作业要做. CUC的老师很严格,每个老师都会给他一个DDL(deadline). 如果lyb在DDL后交作业,老师就会扣他的分. 现在 ...
- HDU-1052(贪心策略)
Tian Ji -- The Horse Racing Problem Description Here is a famous story in Chinese history. "Tha ...
- BZOJ 1029: [JSOI2007]建筑抢修【优先队列+贪心策略】
1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 4810 Solved: 2160[Submit][Statu ...
- 51nod1673 树有几多愁 - 贪心策略 + 虚树 + 状压dp
传送门 题目大意: 给一颗重新编号,叶子节点的值定义为他到根节点编号的最小值,求所有叶子节点值的乘积的最大值. 题目分析: 为什么我觉得这道题最难的是贪心啊..首先要想到 在一条链上,深度大的编号要小 ...
随机推荐
- SqlServer执行大的数据库脚本出错解决方法
如果执行线上项目拷下来sqlserver的.sql的数据库脚本文件,如果文件较大时,那么就会报错内存不足之类的. 这时可以在命令提示符使用命令来执行脚本文件.切记,执行前先改一下数据库存放位置! 命令 ...
- 20155339 Exp8 Web基础
Exp8 Web基础 基础问题回答 (1)什么是表单 表单在网页中主要负责数据采集功能. 一个表单有三个基本组成部分: 表单标签,这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方 ...
- EZ 2018 03 16 NOIP2018 模拟赛(四)
链接:http://211.140.156.254:2333/contest/64 我去掉了一百多分! 这次的题目怎么说呢,特别水,但是就是出现了一些很逗的错误导致炸裂. 最好笑的是SB的不只我一个: ...
- POJ 2299
上课讲了下数据结构,因为暂时没找到分块的板子题,所以做一下这道题加深一下对树状数组的理解. 题意就是求逆序对,从逆序对的定义就可以看出,方法有两种:归并 or 树状数组. 感觉树状数组更高级一点,写起 ...
- 【php增删改查实例】第八节 - 部门管理模块(编写PHP程序)
首先,在同级目录新建一个query.php文件: 接着,去刷新页面,打开F12,NetWork,看看当前的请求能不能走到对应的php文件? 这就说明datagrid确实能够访问到query.php 只 ...
- 11、Dockerfile实战-Tomcat
一.编写Dockerfile 具体步骤这里不再细说,直接看Dockerfile文件: FROM centos:7 MAINTAINER QUNXUE ENV VERSION=8.0.46 RUN yu ...
- effective c++ 笔记 (9-12)
//---------------------------15/03/29---------------------------- //#9 绝不在构造和析构过程中调头virtual函数 { / ...
- 记录:tf.saved_model 模块的简单使用(TensorFlow 模型存储与恢复)
虽然说 TensorFlow 2.0 即将问世,但是有一些模块的内容却是不大变化的.其中就有 tf.saved_model 模块,主要用于模型的存储和恢复.为了防止学习记录文件丢失或者蠢笨的脑子直接遗 ...
- 【转载】kafka 基础知识
1. kafka介绍 1.1. 主要功能 根据官网的介绍,ApacheKafka®是一个分布式流媒体平台,它主要有3种功能: 1:It lets you publish and ...
- B1029 旧键盘 (20 分)
20/20,第一次没调试就过了. #include<bits/stdc++.h> using namespace std; /* 1.standardize 2.put to the se ...