经典贪心:最短过桥时间
来源:互联网 发布:java socket 心跳实例 编辑:程序博客网 时间:2024/04/30 22:06
以下内容来自转载:
原是4人过桥,ABCD要单独过桥分别需要用时1分、2分、5分、10分,过桥需要灯(只有一盏),一次只能2人一起过(意味着需要有人送灯回来),过桥时间已用时多的人为准,你如何设计一个方案,让用的时间最少。
问题分析:A和B先过,A回来,CD再过,B回来,AB第二次过。17秒完成!
用C语言拓展成n人过桥,过桥时间自定,求过桥最短用时的方案。
先解决最少时间过桥的问题。好好理解贪心法:
1)当人数<3时,直接过
2)当人数=3时,我们假设过河时间是从小到大的a,b,c (后期排列的问题易解决),显然用最小的来送灯(c+a+b<c+b+b)
3)当人数=4时,a,b,c,d(同样是升序)
Ⅰ如果用最小的来送(配合最大的过去,a回来,再陪次大的过去,回来):d+a+c+a+b=d+c+b+2a
Ⅱ如果先让最小的两个过桥,再让其中一个回来,让最大的两个过桥,再让之前留下来的那个回来,再让最小的2个过桥:b+a+d+b+b=d+3b+a
当d+c+b+2a<d+3b+a,即c-2b+a<=0时,用第一种方法,否则用第二种方法
4)当人数>4时,a,b....c,d(升序),如果让最小的来送,d+a+c+a=d+c+2a,如果先让两个最小的过桥b+b+a+d=d+2b+a.那么c-2b+a<=0时,用第一种方法。
对输入的数据可以用快速排序来排下序(关于qsort的使用,可以参见《使用VC库函数中的快速排序函数》)。
#include<stdio.h>
#define MAX 100
int
CrossBridge(
int
a[],
int
n)
{
int
time
;
if
(n==1)
{
time
=a[0];
printf
(
"桥左->桥右:%d\n"
,a[0]);
return
time
;
}
else
if
(n==2)
{
time
=a[1];
printf
(
"桥左->桥右:%d,%d\n"
,a[0],a[1]);
return
time
;
}
else
if
(n==3)
{
time
=a[0]+a[1]+a[2];
printf
(
"桥左->桥右:%d,%d\n"
,a[2],a[0]);
printf
(
"返回送灯->:%d\n"
,a[0]);
printf
(
"桥左->桥右:%d,%d\n"
,a[0],a[1]);
return
time
;
}
else
{
if
(2*a[1]>a[0]+a[n-2])
{
time
=2*a[0]+a[n-1]+a[n-2];
printf
(
"桥左->桥右:%d,%d,\n"
,a[n-1],a[0]);
printf
(
"返回:%d\n"
,a[0]);
printf
(
"桥左->桥右:%d,%d\n"
,a[0],a[n-2]);
printf
(
"返回:%d\n"
,a[0]);
}
else
{
time
=a[0]+a[1]+a[n-1]+a[1];
printf
(
"桥左->桥右:%d,%d\n"
,a[0],a[1]);
printf
(
"返回:%d\n"
,a[0]);
printf
(
"桥左->桥右:%d,%d\n"
,a[n-1],a[n-2]);
printf
(
"返回:%d\n"
,a[0]);
}
return
time
+CrossBridge(a,n-2);
}
}
void
sort(
int
b[],
int
n)
{
int
i,j,k,index,temp;
for
(i=0;i<n-1;i++)
{
index=i;
for
(j=i+1;j<n;j++)
{
if
(b[index]>b[j])
index=j;
}
temp=b[i];
b[i]=b[index];
b[index]=temp;
}
for
(k=0;k<n;k++)
printf
(
"%-3d"
,b[k]);
}
int
main()
{
int
crossnum,i;
int
t[MAX];
printf
(
"请输入要过桥的人数n:"
);
scanf
(
"%d"
,&crossnum);
printf
(
"依次输入每个人过桥所需的时间\n"
);
for
(i=0;i<crossnum;i++)
{
scanf
(
"%d"
,&t[i]);
}
printf
(
"按升序自动排列:"
);
sort(t,crossnum);
printf
(
"过桥方案如下:\n"
);
printf
(
"这%d人过桥的最短时间为:%d\n"
,crossnum,CrossBridge(t,crossnum));
return
0;
}
0 0
- 经典贪心:最短过桥时间
- 最短过桥时间
- 最短过桥时间
- 最短过桥时间
- 过桥时间最短问题
- poj2573怎样方案过桥时间最短
- 过桥时间最短的算法实现(TopCoder)
- 贪心算法最短路径
- 经典过桥问题证明
- PHP经典算法过桥。
- 求最短过桥时间问题
- 过桥时间问题
- 同样经典的最短路径算法
- 课程设计 最小时间 最短路径 模板 .
- 过桥问题【经典笔试问题】
- 经典智力测试:过桥问题
- poj 2499 计算二叉树的“最短”路径 -> 贪心
- hdu 5385 The path (贪心+最短路径树)
- dreamwear中创建li:hover
- 程序员小笑话
- woj1537&&woj1538(递推)
- 三重积分题z=0,z=y,y=1和抛物柱面y=x^2,所围成的有限闭区域,∫∫∫ydxdydz
- 初学正则表达式
- 经典贪心:最短过桥时间
- hdu4287 Intelligent IME--哈希表
- [数据结构]MyString
- 数据处理工具类(求和,平均值,最大值,最小值。。。)
- 51nod 1246 罐子和硬币
- VPN中的密钥交换算法
- 【Light】[1213]Fantasy of a Summation
- ContentResolver查询系统音乐文件
- C#单例模式使用