编程思维 | 小明一家如何过桥
年轻人如果心存对未来的崇敬,对今天的认真踏实,对昨天的感恩,就会有机会。
- 马云 -
【问题区】
小明一家过一座桥,过桥时是黑夜,所以必须有灯。现在小明过桥要1秒,小明的弟弟要3秒,小明的爸爸要6秒,小明的妈妈要8秒,小明的爷爷要12秒。每次此桥最多可过两人,而过桥的速度依过桥最慢者而定,而且灯在点燃后30秒就会熄灭。
问:小明一家如何过桥?
【提示区】
要在最短的过桥时间内过桥,一定要让考虑过桥消耗时间最长的两个人同时过桥!同时,让过桥速度最快的人返回送灯。同学们,Good Luck!
【视频讲解】
请前往腾讯视频观看:
https://v.qq.com/x/page/l0823kihobf.html
【C代码实现区】
#include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 5 /********************************** *使用冒泡排序对数组实现由小到大的排序排列 *参数: * nums - 待排序的数组 * len - 数组的长度 *返回值: * 无 ***********************************/ void bubble_sort(int nums[],int len){ int i = 0, j = 0; int temp = 0, isSorted = 0; for(i=0; i<len-1; i++){ isSorted = 1; //假设剩下的元素已经排序好了 for(j=0; j<len-1-i; j++){ if(nums[j] > nums[j+1]){ temp = nums[j];
nums[j] = nums[j+1]; nums[j+1] = temp; //一旦需要交换数组元素,继续排序 isSorted = 0; } }
//如果没有发生交换,说明剩下的元素已经排序好了 if(isSorted) break; }
} int main(void){ int i = 0; int times = 1; int src[SIZE]={12,8,1,3,6};//待过河人数和耗时 int slen = SIZE;//未过河人数 int dest[SIZE]={0};//已过河人数和耗时信息 int dlen = 0;//已过人数 int time = 0;//过河总耗时 while(slen>1){ /* 如果是第奇数(1,3...)趟,让最快的两个同时过河, 同时让速度最快的返回送灯 */ bubble_sort(src, slen); if((times%2) == 1){ dest[dlen++] = src[0]; dest[dlen++] = src[1]; time += src[1]; printf("-->%d %d 同时过河,耗时:%d\n",src[0], src[1], src[1]); //耗时最长的两人同时过河,从dest 数组中删除 for(i=2; i< slen; i++){ src[i-2]=src[i]; } slen-=2;
}else {//第偶数(2,4...)趟,让最慢的两个人同时过河 dest[dlen++] = src[slen-2]; dest[dlen++] = src[slen-1]; time += src[slen-1];
printf("-->%d %d 同时过河,耗时:%d\n",src[slen-1], src[slen-2], src[slen-1]); slen-=2; } if(slen<1) break;
/* 让已到达的人中速度最快的人返回送灯 算法实现:先将数组从小到大排序,再派第一个返回送灯 */ bubble_sort(dest,dlen); src[slen++]=dest[0]; time += dest[0];
printf("<-- %d 返回送灯\n", dest[0]); //耗时最长的人返回,从dest 数组中删除 for(i=1; i< dlen; i++){ dest[i-1]=dest[i]; } dlen--; times++; } printf("\n过河总耗时:%d\n", time); return 0; }
--------------------------------
运行结果:
*易企业邮局架构师,老板邮局的首席架构师,曾任职于多家上市公司。
十二年行业(C/C++)开发经验,一直专注于Linux服务器端高并发应用程序和分布式大数据存储系统的开发和架构。