4
1 2 5 10
答案:17
顺序是:1、2去,1回;5、10去;2回;1、2去。
1) 如果N=1、2,所有人直接过桥。
2) 如果N=3,由最快的人往返一次把其他两人送过河。
1 2 5 10
答案:17
顺序是:1、2去,1回;5、10去;2回;1、2去。
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移动过桥
下面是poj1700
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[1010];
int main()
{
int T,n;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
int sum=0;
int i;
for(i=n-1;i>2;i-=2)
if(2*a[0]+a[i]+a[i-1]>2*a[1]+a[i]+a[0])
sum+=2*a[1]+a[i]+a[0];
else
sum+=2*a[0]+a[i]+a[i-1];
if(i==2)
sum+=a[0]+a[1]+a[2];
else if(i==1)
sum+=a[1];
else
sum+=a[0];
printf("%d\n",sum);
}
return 0;
}
下面是poj2573
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[1010];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
int sum=0;
int i;
for(i=n-1;i>2;i-=2)
if(2*a[0]+a[i]+a[i-1]>2*a[1]+a[i]+a[0])
sum+=2*a[1]+a[i]+a[0];
else
sum+=2*a[0]+a[i]+a[i-1];
if(i==2)
sum+=a[0]+a[1]+a[2];
else if(i==1)
sum+=a[1];
else
sum+=a[0];
printf("%d\n",sum);
for(i=n-1;i>2;i-=2)
if(2*a[0]+a[i]+a[i-1]>2*a[1]+a[i]+a[0])
printf("%d %d\n%d\n%d %d\n%d\n",a[0],a[1],a[0],a[i],a[i-1],a[1]);
else
printf("%d %d\n%d\n%d %d\n%d\n",a[i],a[0],a[0],a[i-1],a[0],a[0]);
if(i==2)
printf("%d %d\n%d\n%d %d\n",a[1],a[0],a[0],a[2],a[0]);
else if(i==1)
printf("%d %d\n",a[0],a[1]);
else
printf("%d\n",a[0]);
return 0;
}