关于编程?
发布网友
发布时间:2022-04-25 17:05
我来回答
共3个回答
热心网友
时间:2023-10-21 14:20
若N人过桥
1)
如果N=1、2,所有人直接过桥。
2)
如果N=3,由最快的人往返一次把其他两人送过河。
3)
如果N≥4,设A、B为走得最快和次快的旅行者,过桥所需时间分别为a、b;
而Z、Y为走得最慢和次慢的旅行者,过桥所需时间分别为z、y。那么
当2b>a+y时,使用模式一将Z和Y移动过桥;
当2b<a+y时,使用模式二将Z和Y移动过桥;
当2b=a+y时,使用模式一将Z和Y移动过桥。
这样就使问题转变为N-2个旅行者的情形,从而递归解决之。
……
A
Z
→
A
←
……
也就是“由A护送到对岸,A返回”,称作“模式一”。
……
……
第n-2步: A
B
→
第n-1步: A
←
第n步:
Y
Z
→
第n+1步: B
←
……
这个模式是“由A和B护送到对岸,A和B返回”,称作“模式二”。
C++代码:
#include<iostream>
#include<algorithm>
using
namespace
std;
int
main()
{
int
n
=
4;
int
i,fast1,fast2,slow1,slow2,sum,l;
sum
=
0;
int
*a
=
new
int
[n];
for(i
=
1;i
<=
n;i++)
cin
>>
a[i];
sort(a
+
1,a
+
n
+
1);
fast1
=
a[1];
fast2
=
a[2];
slow1
=
a[n-1];
slow2
=
a[n];
l
=
1;
while(n
!=
0)
{
if(n
==
1
||
n
==
2)
{sum
+=
slow2;break;}
if(n
==
3)
{sum+=(slow2+slow1+fast1);break;}
if(2*fast2
>=
fast1+slow1)
{sum+=(slow1+slow2+2*fast1);n-=2;slow2=a[n];slow1=a[n-1];}
else
{sum+=2*fast2+fast1+slow2;n-=2;slow2=a[n];slow1=a[n-1];}
}
cout<<sum<<endl;
return
0;
}
分析非原创,原创代码有点瑕疵,个人修改了下
希望对你有帮助
热心网友
时间:2023-10-21 14:21
这类问题每天都有N个人来问,自己搜索一下吧,就我个人来说,我对那些自己什么都不干全指望别人帮忙的相当反感
热心网友
时间:2023-10-21 14:21
找本书看看