前言:
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)
{
int tmp = p[i];
p[i] = p[min];
p[min] = tmp;
}
}
}
int max_peo(int* p, int n)
{
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;
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)
{
Time =Time+ max1 + max_max + max_min;
break;
}
else if (tmp == 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)
{
int tmp = p[i];
p[i] = p[min];
p[min] = tmp;
}
}
}
int max_peo(int* p, int n)
{
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;
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)
{
Time =Time+ max1 + max_max + max_min;
break;
}
else if (tmp == 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;
}
效果图