问题描述:晚上有四个人要过桥,只有一个手电筒,每次过桥都需要手电筒,每次最多可同时过两个人,其中甲过桥要1分钟,乙要2分钟,丙要5分钟,丁要10分钟。求最短的过桥时间。
#include<stdio.h>
void select_sort(int a[],int len){
int i,j,temp;
for(i=1;i<=len-1;i++){
for(j=i+1;j<=len;j++){
if(a[i]>a[j]){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
int main(){
int n,t=0,i;
scanf("%d",&n);
int a[n+1];
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
select_sort(a,n);
while(n>0){
if(n==1){
printf("用时%d分钟的过桥\n",a[1]);
t+=a[1];
break;
}
if(n==2){
printf("用时%d分钟的和用时%d分钟的过桥\n",a[1],a[2]);
t+=a[2];
break;
}
if(n==3){
printf("用时%d分钟的和用时%d分钟的过桥\n",a[1],a[2]);
printf("用时%d分钟的返回\n",a[1]);
printf("用时%d分钟的和用时%d分钟的过桥\n",a[1],a[3]);
t+=a[1]+a[2]+a[3];
break;
}
if(n>3){
if((a[n-1]+a[n]+2*a[1])<(a[n]+a[1]+2*a[2])){
t+=a[n-1]+a[n]+2*a[1];
printf("用时%d分钟的和用时%d分钟的过桥\n",a[1],a[n]);
printf("用时%d分钟的返回\n",a[1]);
printf("用时%d分钟的和用时%d分钟的过桥\n",a[1],a[n-1]);
printf("用时%d分钟的返回\n",a[1]);
}
else{
t+=a[n]+a[1]+2*a[2];
printf("用时%d分钟的和用时%d分钟的过桥\n",a[1],a[2]);
printf("用时%d分钟的返回\n",a[1]);
printf("用时%d分钟的和用时%d分钟的过桥\n",a[n-1],a[n]);
printf("用时%d分钟的返回\n",a[2]);
}
n-=2;
}
}
printf("总用时长:%d",t);
return 0;
}