3) 如果N≥4,设A、B为走得最快和次快的旅行者,过桥所需时间分别为a、b;而Z、Y为走得最慢和次慢的旅行者,过桥所需时间分别为z、y。那么 当2b>a+y时,使用模式一将Z和Y移动过桥; 当2b<a+y时,使用模式二将Z和Y移动过桥; 当2b=a+y时,使用模式一将Z和Y移动过桥
下面是poj1700
#include<stdio.h> #include<algorithm> using namespace std; int a[1010]; int main() { int T,n; scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); int sum=0; int i; for(i=n-1;i>2;i-=2) if(2*a[0]+a[i]+a[i-1]>2*a[1]+a[i]+a[0]) sum+=2*a[1]+a[i]+a[0]; else sum+=2*a[0]+a[i]+a[i-1]; if(i==2) sum+=a[0]+a[1]+a[2]; else if(i==1) sum+=a[1]; else sum+=a[0]; printf("%d\n",sum); } return 0; }
下面是poj2573
#include<stdio.h> #include<algorithm> using namespace std; int a[1010]; int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); int sum=0; int i; for(i=n-1;i>2;i-=2) if(2*a[0]+a[i]+a[i-1]>2*a[1]+a[i]+a[0]) sum+=2*a[1]+a[i]+a[0]; else sum+=2*a[0]+a[i]+a[i-1]; if(i==2) sum+=a[0]+a[1]+a[2]; else if(i==1) sum+=a[1]; else sum+=a[0]; printf("%d\n",sum); for(i=n-1;i>2;i-=2) if(2*a[0]+a[i]+a[i-1]>2*a[1]+a[i]+a[0]) printf("%d %d\n%d\n%d %d\n%d\n",a[0],a[1],a[0],a[i],a[i-1],a[1]); else printf("%d %d\n%d\n%d %d\n%d\n",a[i],a[0],a[0],a[i-1],a[0],a[0]); if(i==2) printf("%d %d\n%d\n%d %d\n",a[1],a[0],a[0],a[2],a[0]); else if(i==1) printf("%d %d\n",a[0],a[1]); else printf("%d\n",a[0]); return 0; }