Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 7873 | Accepted: 2879 |
Description
Input
Output
Sample Input
1 4 1 2 5 10
Sample Output
17
题意:
几个人过河,每次过两人一人回,速度由慢者决定。问过河所需最短时间。
分析:
寻找过河最优策略的规律,对于n个人过河,按速度从小到大排列。有两种最优策略供选择:①最快和次快过去,最快回;最慢和次慢过去,次快回,t=s[1]+s[0]+s[n-1]+s[1]。②最快和最慢过去,最快回;最快和次快过去,最快回,t=s[n-1]+s[0]+s[n-2]+s[0]。选择两者中用时较少的一个策略执行。如此便将最慢和次慢送过河,对剩下n-2个人循环处理。注意当n=1、n=2、n=3时直接相加处理即可。
程序源代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
freopen("in.txt","r",stdin);
int speed[1000];
int t,n,time;
cin>>t;
int i,j;
for(i=0;i<t;i++)
{
cin>>n;
memset(speed,0,sizeof(speed));
for(j=0;j<n;j++)cin>>speed[j];
sort(speed,speed+n); //从小到大排序
time=0;
while(n>3)
{
if(speed[1]*2 > speed[0]+speed[n-2])
time=time+speed[0]+speed[0]+speed[n-1]+speed[n-2];
else time=time+speed[1]+speed[0]+speed[n-1]+speed[1];
n=n-2;
}
if(n==3)
time=time+speed[0]+speed[1]+speed[2];
else if(n==2)
time=time+speed[1];
else if(n==1)
time=time+speed[0];
cout<<time<<endl;
}
return 0;
}