POJ—1700(Crossing River)

Crossing River
Time Limit: 1000MS Memory Limit: 10000K
Total 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

1
4
1 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;
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值