POJ—1700(Crossing River)

来源:互联网 发布:jquery get json 编辑:程序博客网 时间:2024/06/12 00:39
Crossing River
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 16564 Accepted: 6289

Description

A group of N people wishes to go across a river with only one boat, which can at most carry two persons. Therefore some sort of shuttle arrangement must be arranged in order to row the boat back and forth so that all people may cross. Each person has a different rowing speed; the speed of a couple is determined by the speed of the slower one. Your job is to determine a strategy that minimizes the time for these people to get across.

Input

The first line of the input contains a single integer T (1 <= T <= 20), the number of test cases. Then T cases follow. The first line of each case contains N, and the second line contains N integers giving the time for each people to cross the river. Each case is preceded by a blank line. There won't be more than 1000 people and nobody takes more than 100 seconds to cross.

Output

For each test case, print a line containing the total number of seconds required for all the N people to cross the river.

Sample Input

141 2 5 10

Sample Output

17

题目描述:有N人要过河,但是船太小了,导致只能在船上乘坐两个人,而且,每个人都有不同的划船速度,当两个人一起划船时,速度取决于较慢的人的划船速度,问要将所有人都带到河的对岸,最少需要多少时间。

解题分析:首先案例讲解,4个人,速度分别为1-2-5-10,有第一种运载方式:首先第一个人将第二个人带到河对岸,然后返回,一直重复此操作,最终时间为19分钟与输出不同;第二种方式首先第一个人将第二个人运到对岸,花时间2min,之后第一个人回来,花时间1min,之后将第三个人和第四个人运到河对岸,花时间10min,第二个人乘船回来,花时间2min,最后第一和第二个人过河,时间2min,总时间17min。所以此题每次载人过河有两种不同的过河方案,需要特殊选择。

AC code:

#include<cstdio>#include<iostream>#include<algorithm>using namespace std;int main (void){int a,b;cin>>a;while(a--){int i,j;int p[10005];//time代表总时间 //time1代表第一种过河策略时间,time2代表第二种过河策略时间 int time=0,time1,time2;cin>>b;for(i=0;i<b;i++)cin>>(p[i]);sort(p,p+b);if(b==1){cout<<p[0]<<endl;continue;}if(b==2) {cout<<p[1]<<endl;continue;}if(b%2==0){for(i=b-1;i>1;i=i-2){time1 = p[i] + p[i-1] + p[0]*2;time2 =  p[i] + 2*p[1] + p[0];time = time +min(time1,time2);}time = time + p[1];}else{for(i=b-1;i>2;i=i-2){time1 = p[i] + p[i-1] +p[0]*2;time2 =  p[i] + 2*p[1] + p[0];time = time +min(time1,time2);}time1 =p[1]+p[2]+p[0];time = time + time1;}cout<<time<<endl;}}




原创粉丝点击