过河问题

时间限制: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

这个题要用贪心算法,
一个人的时候没话说
两个人是时间较长的那个人
三个人的时候,先让第一短时间的人带时间最长的过去,时间短的再返回,带第二短的人过去
四个人及其以上的时候,有两种方法时间较短
      1.第一短的带最长的,再回来带第二短的,依次带完
      2.第一短带第二短,第一短回来,把手电给最长和第二长,再让第二短回来
      这两种方法只是送过去两个人
 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int time[]; int main()
{
int n,i,b,N;
scanf("%d",&N);
while(N--)
{
scanf("%d",&n);
for(i=;i<n;i++)
{
scanf("%d",&time[i]);
}
sort(time,time+n);
int sum=;
while(n>)
{
if(*time[]+time[]>*time[]+time[n-])
sum+=*time[]+time[n-]+time[n-];
else
sum+=*time[]+time[]+time[n-];
n-=;
}
if(n==)
sum+=time[]+time[]+time[];
if(n==)
sum+=time[];
if(n==) sum += time[];
printf("%d\n",sum);
}
return ;
}

最新文章

  1. Jass 技能模型定义(—):半人马酋长的反击光环
  2. Unity学习疑问记录之触摸点坐标
  3. supervisord 小记
  4. Linux ps aux指令詳解--转
  5. JDK动态代理例子
  6. GExpert 1.38 实验版含经典代码格式工具 Berlin 编译版
  7. DirectSound应用
  8. redux-form的学习笔记二--实现表单的同步验证
  9. 单例模式——Java EE设计模式解析与应用
  10. h5audio标签
  11. (floyd)佛洛伊德算法
  12. [转]C# 之DLL调用(托管与非托管)
  13. sqlserver数据库发送邮箱
  14. TCP笔记
  15. python模块之sys和subprocess以及编写简单的主机扫描脚本
  16. Python 获取文件中最长行的长度和最长行
  17. K3CLOUD安装教程
  18. Thinkphp5笔记一:项目部署
  19. SQL分组合并
  20. BitAdminCore框架更新日志20180516

热门文章

  1. CI框架微信开发-自定义菜单
  2. Raising Modulo Numbers(POJ 1995 快速幂)
  3. 子shell的$$
  4. C# 新特性_协变与逆变 (.net 4.0)
  5. lambda演算
  6. 【LeetCode练习题】Minimum Path Sum
  7. [置顶] 九度笔记之 1434:今年暑假不AC
  8. Spring整合Quartz
  9. Windows Message Queue(优先队列)
  10. telnet查看memcached运行参数说明