过河问题
来源:互联网 发布:机器人离线编程 编辑:程序博客网 时间:2024/05/20 22:02
QAQ
先假设有4个人
四人所需要的时间分别是1、2、5、8分钟 策略1:让最小的送最大的,尽量减少回来的时间
先让甲乙过去(2分钟),甲回来(1分钟),甲丙过去(5分钟),甲回来(1分钟),甲丁再过去(8分钟),总共需要17分钟就可以让四个人都过去。 策略2:让最慢的两个人同时过桥,让已经过桥的人来担负送手电筒的责任
而正确答案是第二种办法:先让甲乙过去(2分钟),甲回来(1分钟),丙丁过去(8分钟),乙回来(2分钟),甲乙再过去(2分钟),总共需要15分钟就可以让四个人都过去。
所以说策略二最优?
不存在的!
把四人所需要的时间,改变一下分别,是1、4、5、8分钟。
第一种方法:先甲乙过去(4分钟),甲回来(1分钟),甲丙过去(5分钟),甲回来(1分钟),甲丁再过去(8分钟),总共需要19分钟就可以让四个人都过去。
第二种方法:先让甲乙过去(4分钟),甲回来(1分钟),丙丁过去(8分钟),乙回来(4分钟),甲乙再过去(4分钟),总共需要21分钟就可以让四个人都过去。
这一次,两个最慢的人一起过去反而更慢了。
这两次方案的差异:次快的人要不要也传递一次手电筒。
到最后正确的贪心是!
两个方案取min
大于4时可以用4的方法贪三个人的,直到变成<4的为止。
#include <cstdio>#include <iostream>#include <algorithm>using namespace std;int a[199999];int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",a+i); sort(a+1,a+n+1); int ans=0; while(n>=4) { ans+=min(a[1]+2*a[2]+a[n],2*a[1]+a[n]+a[n-1]); n-=2; } if(n==3) ans+=a[1]+a[2]+a[3]; if(n==2) ans+=a[2]; if(n==1) ans+=a[1]; printf("%d",ans);}
阅读全文
0 0
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- [LeetCode]684. Redundant Connection
- 记法分析器Java版
- django实战oauth2 provider/consumer和google oauth2详解
- MySQL 视图
- java环境变量配置详细
- 过河问题
- JQuery选择器
- 第十三天 函数(高阶和匿名)
- go创建一个连接池
- Matlab2017 安装alexnet
- 字符串对象的创建问题
- 第14期《成长之路》2017年11月刊
- PAT (Basic Level) Practise (中文)1023. 组个最小数 (20)
- Netty源码分析:read