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; }