http://www.cppblog.com/abilitytao/archive/2009/03/28/78197.html
题目描述:在漆黑的夜里,四位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,四个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,四人所需要的时间分别是1、2、5、8分钟;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这四人尽快过桥。
解题思路:
当人数等于1,2,3的时候:答案很容易得出;
当人数大于等于4时:
若设过桥速度最快的那个人过桥时间为a,第二快为b;过桥第二慢的那个人过桥时间为y,最慢为z;
此时有两种过桥方案:
一.最快和次快的人先过,然后最快的回来,然后最慢与次慢的人再过,次快的回来;
二.最快的和最慢的过,快的回来,在和次慢的过,快的再回来;
第一种方法时间为b*2+a+z
第二种方法时间为y+z+2*a
如果第一种大于第二种 有2*b+a+z>y+z+2*a
化简得
2*b>y+a;
此时只要比较2*b和a+y的大小即可知道那种方法更优 O(∩_∩)O~ 编程解决即可
#include<iostream>
#include<algorithm>
#include<numeric>
using namespace std;
int a[1000];
int main()
{
int testcase;
int n;
int i;
int j;
int sum=0;
scanf("%d",&testcase);
for(j=1;j<=testcase;j++)
{
sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+n);
while(n)
{
if(n==1)
{
sum+=a[1];
n=0;
}
else if(n==2)
{
sum+=a[2];
n=0;
}
else if(n==3)
{
sum+=(a[2]+a[3]+a[1]);
n=0;
}
else if(n>=4)
{
if(2*a[2]>a[1]+a[n-1])
{
sum+=(a[n-1]+a[n])+2*a[1];
n-=2;
}
else
{
sum+=(a[2]+a[1]+a[n]+a[2]);
n-=2;
}
}
}
printf("%d\n",sum);
}
system("pause");
return 0;
}