NYOJ 47过河问题
2017-03-13 21:20
260 查看
过河问题
时间限制: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
来源POJ
上传者张云聪
问题分析:
使用数组,把使用的时间进行排序,假设人数为n
排序后的数组为a[0],a[1],a[2] .........a[n-1]
当人数n==1的时候,直接过河就行了 时间为a[0]
当人数n==2的时候,时间为a[1]
当人数n==3的时候,时间最少的人和时间最长的人先过去,然后,时间最少的人回来,和时间为中间的那个人一起过去,所以时间为a[2]+a[0]+a[1]
当人数n>=4的时候,时间最少的话有两种方案:
第一种方案:时间最少的人和时间最长的人一起过去的话,然后时间最少的人回来,然后和时间倒数第二长的人一起过去,然后时间最短的自己再回来
时间为a[n-1]+a[0]+a[n-2]+a[0]
为2*a[0]+a[n-1]+a[n-2]
第二种方案:时间最少的人和时间第二少的人一起过去,然后最少的人回去,然后时间最长的和时间倒数第二长的人一起过去,然后时间第二少的人再回去
时间为a[1]+a[0]+a[n-1]+a[1]
时间为2*a[1]+a[0]+a[n-1]
上面两种方案,每次都是过去了两个人,这里我是理解了一会儿,才明白上面是每次都是过去了两个人,也就是如果是4个人的话,两个人过去了,后面还有两个人在那面等着呢
所以是n-=2;
所以需要比较2*a[0]+a[n-1]+a[n-2]与2*a[1]+a[0]+a[n-1]的时间,哪一个少取哪一个
代码如下:
#include <iostream> #include <algorithm> using namespace std; int a[1005]; int main() { int t; cin>>t; while(t--){ int n,sum=0; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } sort(a,a+n); while(n>=4){ if(2*a[0]+a[n-2]+a[n-1]>a[0]+2*a[1]+a[n-1]){ sum+=a[0]+2*a[1]+a[n-1]; }else{ sum+=2*a[0]+a[n-2]+a[n-1]; } n-=2; } if(n==3) sum=sum+a[0]+a[1]+a[2]; if(n==2) sum=sum+a[1]; if(n==1) sum+=a[0]; cout<<sum<<endl; } }参考文章地址:http://blog.csdn.net/lin14543/article/details/47399221
相关文章推荐
- NYOJ47过河问题
- NYOJ-47过河问题
- NYOJ47 过河问题
- NYOJ 47 过河问题 (贪心)
- NYOJ47过河问题
- NYOJ_47 过河问题,贪心选择
- nyoj 47 过河 过河问题 【贪心】
- nyoj-47-过河问题|POJ-1700-Crossing River
- NYOJ-47-过河问题-2013年08月15日16:17:01
- NYOJ 47 过河问题
- nyoj-47-过河问题&&poj-1700-Crossing River
- NYOJ 47过河问题
- nyoj47过河问题(贪心)
- NYOJ 47 过河问题
- NYOJ47——过河问题(贪心)
- NYOJ-47 过河问题 http://acm.nyist.net/JudgeOnline/problem.php?pid=47
- 过河问题nyoj47
- nyoj47过河问题(贪心)
- nyoj-47-过河问题
- NYOJ-47 过河问题(贪心)