标签:
#include<iostream> #include<algorithm> using namespace std; int n,a[1006]; int main() { int t,i; cin>>t; while(t--) { int f=0; //每次f归0 cin>>n; for(i=1;i<=n;i++) cin>>a[i]; sort(a,a+n+1); while(n) { if(n==1) { f+=a[1]; break; } if(n==2) { f+=a[2]; break; } if(n==3) { f+=a[1]+a[2]+a[3]; break; } if(n>3) { if(2*a[2]>(a[1]+a[n-1])) f+=2*a[1]+a[n]+a[n-1]; else f+=2*a[2]+a[1]+a[n]; n=n-2; //注意循环 } } cout<<f<<endl; } return 0; }
Description
Input
Output
Sample Input
1 4 1 2 5 10
Sample Output
17
程序分析:
这是一个过河坐船问题,一共有两个策略
①最快和次快过去,最快回;最慢和次慢过去,次快回,最快的和次快的过去,t1=a[1]+a[0]+a[n-1]+a[1]+a[1]。
②最快和最慢过去,最快回;最快和次快过去,最快回,最快的和次慢的过去,t2=a[n-1]+a[0]+a[1]+a[0]+a[n-2]。
选择两者中用时较少的一个策略执行,判断t1与t2大小,只需要判断2a[1]是否大于a[0]+a[n-2],如此便将最慢和次慢送过河,对剩下n-2个人循环处理。注意当n=1、n=2、n=3时直接相加处理即可.
标签:
原文地址:http://www.cnblogs.com/yilihua/p/4678497.html