最快过桥思维题

Posted 花嵩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最快过桥思维题相关的知识,希望对你有一定的参考价值。

前言:

1.博主实力有限,有什么错误地方,请你斧正!谢谢!
2.思维题真的真的让人头大 ,但却有意思。0.0.

题目:

有N(N>=2)个人过桥,只有一把手电筒。每个人过桥速度(分钟)由键盘输入。如过2人过桥,时间为速度最慢的那个。问N个人过完桥需要的最短时间。

思路:

1.时间最短,必然传递手电筒的时间最短。因此需要将速度最快的2人做为传手电筒的人选。
# 前言:
1.博主实力有限,有什么错误地方,请你斧正!谢谢!
2.思维题真的真的让人头大

见题目:

有N(N>=2)个人过桥,只有一把手电筒。每个人过桥速度(分钟)由键盘输入。如过2人过桥,时间为速度最慢的那个。问N个人过完桥需要的最短时间。

思路:

1.时间最短,必然传递手电筒的时间最短。因此需要将速度最快的2人做为传手电筒的人选。
2…考虑到手电筒的要求,我们必须让速度的在速度的之前到达对岸。这样不仅桥上时间可以减断,而且当速度慢的到了后,可以让速度快的传送手电筒。
3.实际情况;速度最快次快的2人先走,回来一个速度最快的。然后速度最慢2人过去,速度次快的人回来.然后循环。这样在速度最快次快的2人的配合下,极大的减短,不用考虑中间速度的使用。
4.每次循环相当于送过去2人
5.最后剩3人,和2人的特殊情况,要区分。

程序

从小到大排序数组:
void order_board(int *p,int n)//选择法排序,从小到大。
{
	int i = 0;
	int j = 0;
	int min = 0;
	for (i = 0; i < n - 1; i++)
	{
	
		min = i;
		for (j = i + 1; j < n; j++)
		{
			if (p[j] < p[min])min = j;//遍历找到数组最小的下标。
		}
	
		if (min != i)//选出的下标不为i就交换
		{
		
			int tmp = p[i];
			p[i] = p[min];
			p[min] = tmp;
		}
	}
}
选择出最慢的2个人
int max_peo(int* p, int n)//选择出最长的时间。并在数组中将其重值为0.
{
	int i = 0;
	int max = 0;
	for (i = 0; i < n; i++)
	{
		if (p[i] > p[max])max = i;

	}

	int tmp = p[max];
	p[max] = 0;
	return tmp;
}
循环的开始
void fun(int* p, int n)
{
	int tmp = n;//每次循环相当于送过去2人.
			int max_max = 0;//用于选出的最慢的人
			int max_min = 0;//用于选出的次慢的人.
			int max1 = p[0];//速度最快的人
			int max2 = p[1];//速度次快的人
			int Time = 0;
			while (1)
			{
				max_max = max_peo(p,n); //选出的最慢的人
				max_min = max_peo(p, n); //选出的次慢的人
				if (tmp>3)
				{
					Time = Time + max2 + max1 + max_max + max2;
						tmp-=2;
				}
				else if (tmp==3)//最后只剩3人的特殊情况
				{
					Time =Time+ max1 + max_max + max_min;
					break;
				}
				else if (tmp == 2)//最后只剩2人的特殊情况
				{
				
					Time = Time + max2;
					break;
				}
			}

			printf("所需时间为:%d\\n", Time);
}

全部程序(以多组输入定义main函数)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> 

void order_board(int *p,int n)//选择法排序,从小到大。
{
	int i = 0;
	int j = 0;
	int min = 0;
	for (i = 0; i < n - 1; i++)
	{
	
		min = i;
		for (j = i + 1; j < n; j++)
		{
			if (p[j] < p[min])min = j;//遍历找到数组最小的下标。
		}
	
		if (min != i)//选出的下标不为i就交换
		{
		
			int tmp = p[i];
			p[i] = p[min];
			p[min] = tmp;
		}
	}
}

int max_peo(int* p, int n)//选择出最长的时间。并在数组中将其重值为0.
{
	int i = 0;
	int max = 0;
	for (i = 0; i < n; i++)
	{
		if (p[i] > p[max])max = i;

	}

	int tmp = p[max];
	p[max] = 0;
	return tmp;
}
void fun(int* p, int n)
{
	int tmp = n;
			int max_max = 0;//用于选出的最慢的人
			int max_min = 0;//用于选出的次慢的人.
			int max1 = p[0];//速度最快的人
			int max2 = p[1];//速度次快的人
			int Time = 0;//每次循环相当于送过去2人.
			while (1)
			{
				max_max = max_peo(p,n); //选出的最慢的人
				max_min = max_peo(p, n); //选出的次慢的人
				if (tmp>3)
				{
					Time = Time + max2 + max1 + max_max + max2;
						tmp-=2;
				}
				else if (tmp==3)//最后只剩3人的特殊情况
				{
					Time =Time+ max1 + max_max + max_min;
					break;
				}
				else if (tmp == 2)//最后只剩2人的特殊情况
				{
				
					Time = Time + max2;
					break;
				}
			}

			printf("所需时间为:%d\\n", Time);
}

int main ()
{
	int  peo[100] = { 0};
	int i = 0;
	while (~scanf("%d", &peo[i++]))
	{
		if(getchar() == '\\n')
		{
			int sz = i;
			order_board(peo, sz);
			fun(peo, sz);
			i = 0;//每次都可以重新赋值数组。
		}
	}
	return 0;
}

效果图

以上是关于最快过桥思维题的主要内容,如果未能解决你的问题,请参考以下文章

手电筒过河

华为奇葩面试题:一头牛重800公斤一座桥承重700公斤,请问牛怎么过桥?

在夜里,有4个人要过桥,他们过桥分别要10分钟,5分钟,2分钟,1分钟,有1个手电,一次只能过两个,最短多长能过桥

华为奇葩面试题:一头牛重800公斤一座桥承重700公斤,请问牛怎么过桥?

华为面试题:一头牛重 800 公斤,一座桥承重 700 公斤,请问牛怎么过桥?

BridgeOverARoughRiver(POJ-3404)AdHoc