题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=26251
题目大意:
渡河问题,多组案例T(1<=T<=20),每个案例中有N(N<=1000)个人。每一次渡河最多两人一起,渡河时长按速度慢的即耗时最长的计算,分别给出N个人渡河所需时间(不超过100s),问:怎样安排可以让所有人渡过河且耗时最短?
案例:
Sample Input
1 4 1 2 5 10
Sample Output
17
题目分析:
分情况讨论(运用条件判别语句),如果仅有一人渡河,则耗时为其渡河时长;如果有两人渡河,按耗时最长的计算渡河时长;如果三人渡河(需要注意的是两人渡河后须有一人划船返回),不管采用何种方式,渡河时长均为三人渡河时长累加;如果超过三人以上的人渡河,则有两种快速过河方式:将时长从小到大排序(sort语句)1.始终让最快的人接送他人;2.让最快和次快的人合力接送,譬如a[0]和a[1]先渡河,a[1]回,再a[N-1]和a[N-2]渡河,a[1]回,如此循环。则将a[N-1]和a[N-2]渡河有两种方式,采取耗时最短的即可。
源代码:
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=1000; 5 int a[maxn]; 6 int main() 7 { 8 int T,n,j,k,count,count1,count2; 9 scanf("%d",&T);//案例数 10 for(k=0;k<T;k++) 11 { count=0; 12 scanf("%d",&n);//渡河人数 13 for(j=0;j<n;j++) 14 scanf("%d",&a[j]);//个人渡河时长 15 sort(a,a+n);//排序 16 while(n)//未渡河的人中耗时最长的两人渡河 17 { if(n==1) 18 { count+=a[0]; 19 break;} 20 else if(n==2) 21 { count+=a[1]; 22 break;} 23 else if(n==3) 24 { count+=a[0]+a[1]+a[2]; 25 break;} 26 else 27 { count1=a[1]+a[0]+a[n-1]+a[1];//两人使用第一快速渡河法渡河耗时 28 count2=a[n-1]+a[0]+a[n-2]+a[0];//两人使用第二快速渡河法渡河耗时 29 if(count1<count2) count+=count1;//最短耗时长累计 30 else count+=count2; 31 } 32 n-=2; 33 } 34 printf("%d ",count); 35 } 36 return 0; 37 }