A,B为最快和次快
有两种方式可以使c,d过桥
一是a与c一起走,a回来接d再与d一起走,一直到对岸人为0为止
而是 a与b一起走 a回来送灯 c与d一起走 b回来送灯 重复此过程。
只剩2人时 直接过桥
3 人时 A回来送灯 ac走 a回来送灯 ab走
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #include<set> 10 using namespace std; 11 #define N 1010 12 #define LL long long 13 #define INF 0xfffffff 14 const double eps = 1e-8; 15 const double pi = acos(-1.0); 16 const double inf = ~0u>>2; 17 int a[N]; 18 int main() 19 { 20 int i,n; 21 while(cin>>n) 22 { 23 for(i = 1; i <= n;i++) 24 cin>>a[i]; 25 if(n==1) 26 { 27 cout<<a[1]<<endl; 28 cout<<a[1]<<endl; 29 continue; 30 } 31 sort(a+1,a+n+1); 32 int g = n; 33 int ans = 0; 34 while(g>3) 35 { 36 int s = min(a[g]+a[g-1]+2*a[1],a[2]*2+a[g]+a[1]); 37 ans+=s; 38 g-=2; 39 } 40 if(g==3) 41 ans+=a[1]+a[2]+a[g]; 42 else if(g==2) 43 ans+=a[2]; 44 cout<<ans<<endl; 45 g = n; 46 while(g>3) 47 { 48 int s = a[g]+a[g-1]+2*a[1]; 49 if(s>a[2]*2+a[g]+a[1]) 50 printf("%d %d %d %d %d %d ",a[1],a[2],a[1],a[g-1],a[g],a[2]); 51 else 52 printf("%d %d %d %d %d %d ",a[1],a[g],a[1],a[1],a[g-1],a[1]); 53 g-=2; 54 } 55 if(g==3) 56 printf("%d %d %d %d %d ",a[1],a[g],a[1],a[1],a[2]); 57 else if(g==2) 58 printf("%d %d ",a[1],a[2]); 59 } 60 return 0; 61 }