Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 10212 | Accepted: 3855 |
Description
Input
Output
Sample Input
1 4 1 2 5 10
Sample Output
17
Source
解题思路:
N个人,只有一条船,每个人都有一个划船速度,要求让N个人过河,一次渡河包括两个人先过去,一个人再回来。每次时间取两个人之间用时最多的,一个人的时候的时间就是他自己所用的。求让N个人过完河所用的最短时间。
先把每个人的速度从小到大排序,先考虑简单的情况,一个人,自己过去就可以了。两个人,取时间最长的那个,三个人,最优的是三个人所用时间之和(每让最快的那个单独划船回来)。
四个人或四个以上,就要考虑不同的决策把最慢和次慢的人渡河。有两种决策。
1.始终让最快的单独划船。 最快的和最慢的一起渡河,然后最快的划回来,最快和次慢的一起渡河,最快的再回来。所用时间为 s[n]+s[1] + s[n-1] +s[1]
2.让最快和次快的先过河,最快的划回来,接着最慢和次慢的过河,让次快的划回来。 这样所用时间为 s[2]+s[1]+s[n]+s[2]
两种决策中取时间最短的。
代码:
#include
#include
using namespace std;
int s[1002];
int n,time;
int main()
{
int t;cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>s[i];
sort(s+1,s+1+n);
time=0;
while(n)
{
if(n==1)//还剩下一个人,也就是一开始就有1个人渡河
{
time+=s[1];
break;
}
else if(n==2)
{
time+=s[2];
break;//别忘了break;
}
else if(n==3)
{
time+=s[1]+s[2]+s[3];//最优的方法为每次都让最快的单独划船
break;
}
else
{
time=time+min(s[n]+2*s[1]+s[n-1],2*s[2]+s[1]+s[n]);//比较,让最慢和次慢的两个人渡河有两种方法,取时间最短的那个
n-=2;
}
}
cout<