NYOJ 47 过河问题 (贪心)
2015-08-20 00:00
225 查看
过河问题
时间限制:1000 ms | 内存限制:65535 KB难度:5
描述
在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这N人尽快过桥。
输入第一行是一个整数T(1<=T<=20)表示测试数据的组数
每组测试数据的第一行是一个整数N(1<=N<=1000)表示共有N个人要过河
每组测试数据的第二行是N个整数Si,表示此人过河所需要花时间。(0<Si<=100)
输出输出所有人都过河需要用的最少时间
样例输入
1 4 1 2 5 10
样例输出
17
注 - 此题为:NYOJ 47 过河问题 (贪心)
思路:贪心算法 (有两种方式,选择较小的)
一次送两个(时间最慢的两个) 有两种走法时间 第一:最快的来回传递手电筒 第二:最快和第二快 传递手电筒 最慢和第二慢一起走
已AC代码:
#include<iostream> #include<algorithm> using namespace std; int a[1100]; int main() { int T; cin>>T; while(T--) { int n,i; cin>>n; // n个人 for(i=0;i<n;++i) cin>>a[i]; sort(a,a+n); int t1,t2,t=0; while(n>=4) //一次送两个(时间最慢的两个) 有两种走法时间 t1,t2 { t1=2*a[0]+a[n-1]+a[n-2]; //最快的来回传递手电筒 t2=2*a[1]+a[0]+a[n-1]; //最快和第二快 传递手电筒 最慢和第二慢一起走 if(t1<t2) //选时间少的 t+=t1; else t+=t2; n-=2; } if(n==3) t+=(a[1]+a[0]+a[2]); if(n==2) t+=a[1]; if(n==1) t+=a[0]; cout<<t<<endl; } return 0; }
相关文章推荐
- hdu(2859)——Phalanx(dp)
- VIEWGOOD(远古)网络电视台系统方案
- Android Hook工具Cydia Substrate使用
- Android权限摘要
- 基于live555转发实时视频流Makefile备档
- CENTOS linux kernel 内核编译
- 润达软件-督查督办管理系统
- 数据类型隐式转换测试报告
- 关于block的基本用法
- 长沙钓点
- 架构编译器框架系统 LLVM 使用简介
- UITableViewCellEditStyle多功能的实现
- 天下数据浅谈企业如何实施奖励才能更有效
- fiddler的使用
- ajax https请求返回json数据
- js 中{},[]中括号,大括号使用详解
- 日志系统
- 虚基类
- 字符串部分字符设置颜色
- JAVA并发编程——守护线程(Daemon Thread)