博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
过河问题
阅读量:6549 次
发布时间:2019-06-24

本文共 1328 字,大约阅读时间需要 4 分钟。

过河问题时间限制:1000 ms  |  内存限制:65535 KB难度:5描述在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这N人尽快过桥。 输入第一行是一个整数T(1<=T<=20)表示测试数据的组数每组测试数据的第一行是一个整数N(1<=N<=1000)表示共有N个人要过河每组测试数据的第二行是N个整数Si,表示此人过河所需要花时间。(0
<=100)输出输出所有人都过河需要用的最少时间样例输入141 2 5 10样例输出17来源POJ

解题思路:

  首先按照过河时间从小到大排序,当n>3时候,就是考虑用最小时间先把用时最长的两个人送过河,
且手电筒仍然留在未过河的这边,剩下的再依次求解。

把当前用时最长的两个人送过河可以考虑两种方案:

方案一:
  1 号和 2 号先过河,然后 1 号回来,n 号和 n-1 号过河,然后 2 号再回来
用时:2*a[2]+a[1]+a[n];
方案二:
  1 号和 n 号先过河,然后 1 号再回来,1 号和 n-1 号再过河,之后 1 号再回来
用时:a[n]+a[n-1]+2*a[1];
  所以每次把用时最长的两个人送过河用时应该取上述两种方案中的最小值。至于为什么要先考虑
把用时最长的两个人送个和用的是贪心的思想,因为只有两个用时最长的两个人一块过河才能保证
用时次长的人不会占用过河时间,将时间降到最低.

#include
#include
using namespace std;const int Max=101010;int main(){ int _case; int n,ans,m; int i,j; int temp1,temp2; int a[Max]; scanf("%d",&_case); while(_case--) { scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1); ans=0; m=n; while(m>3) { temp1=2*a[2]+a[1]+a[m]; temp2=a[m]+a[m-1]+2*a[1]; //printf("#%d %d\n",temp1,temp2); if(temp1
View Code

 

转载于:https://www.cnblogs.com/XDJjy/p/3631387.html

你可能感兴趣的文章
C#开发微信门户及应用(5)--用户分组信息管理
查看>>
怎样实现前端裁剪上传图片功能
查看>>
ffmpeg+SDL2实现的视频播放器「退出、暂停、播放」
查看>>
2011/7/3 第二次评审
查看>>
tar解压
查看>>
Apriori 关联算法学习
查看>>
JSLint的使用
查看>>
HTTP POST GET 本质区别详解
查看>>
MD5加密
查看>>
ant
查看>>
微信,想要说爱你,却没有那么容易!
查看>>
有关sqlite与sql
查看>>
MapXtreme 2005 学习心得 概述(一)
查看>>
php进一法取整、四舍五入取整、忽略小数等的取整数方法大全
查看>>
Hibernate的拦截器和监听器
查看>>
WSDP
查看>>
Memory Management
查看>>
JQUERY 对 表格中的数据重排序
查看>>
程序员常用借口指南
查看>>
awk 常用方法
查看>>