(C语言)小船过河代码

【Description】
一群人划船过河,河边只有一条船,这条船可以容纳两个人,船过河后需要一人将船开回,以便所有人都可以过河,每个人过河速度不一样,两个人过河速度取决于慢的那个人,请问最少需要多久让所有人过河?
【Input】
第一行输入人数n;
第二行输入每个人过河所需的时间;
【Output】
输出需要的最少时间
【Sample Input】
4
1 2 5 10
【Sample Output】
17
题目分析:
两种方法,较容易想到的是第一种方式:
第一种办法:先让1 2过去(2分钟),1回来(1分钟),1 5过去(5分钟),1回来(1分钟),1 10再过去(10分钟),总共需要19分钟就可以让四个人都过去。

而正确答案是第二种办法:先让1 2过去(2分钟),1回来(1分钟),5 10过去(10分钟),2回来(2分钟),1 2再过去(2分钟),总共需要17分钟就可以让四个人都过去。

本题的关键在于把最慢的和次慢的两个人运过河,因此只要大于四个人的情况下:只需要将这两种方式这两个人运过河的时间做对比:
第一种:T4+T1+T3+T1
第二种:T2+T1+T4+T2
对比之后取短的就行

源码如下:

#include<stdio.h>
#define N 10

int Time(int *t,int n); 
int sum=0;

main()
{
	int t[N];
	int n,i,j,k,temp;
	printf("请输入要过河的人数:");
	scanf("%d",&n);
	printf("请输入每个人过河所需的最长时间:");
	for(i=0;i<n;i++) scanf("%d",&t[i]);
	
	for(i=0;i<n-1;i++)
	  {
		k=i;
		for(j=i+1;j<n;j++)	if(t[k]>t[j]) k=j;
		if(k!=i) {temp=t[i];t[i]=t[k];t[k]=temp;}
	  }

	Time(t,n);
	
	printf("\n%d",sum);
} 

int Time(int *t,int n)
{
	int i;
	if(n==1) sum=sum+t[0];
	if(n==2) sum=sum+t[0]+t[1];
	if(n==3) sum=sum+t[0]+t[1]+t[2];
	if(n>=4)
	{
		if((t[0]+t[2])>(2*t[1])) sum=sum+t[0]+3*t[1]+t[n-1];
		else sum=sum+2*t[0]+t[1]+t[n-1]+t[n-2];
	}
	
	n=n-2;
	return sum;
	Time(t,n);
}
发布了30 篇原创文章 · 获赞 47 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44040023/article/details/90080084