我
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
n个人要过一座桥,只是在漆黑的夜里,没有火把显然是不行的。但是这n个人只有一个火把,并且这座桥每次最多只能通过两个人。
每个人的速度不同,若两人组队,队伍速度等于较慢一人的速度。你要做的是计算这n个人全部通过这座桥的最少时间。
输入
多组输入。每组数据的第一行是输入一个n,代表有n(1 <= n && n <= 500)个人,接下来的n个整数,代表着每个人穿过这座桥所需要的时间。
输出
输出一个整数,代表最优策略所需时间。
示例输入
4 1 10 5 2
示例输出
17
提示
假设人员编号按输入顺序从1到n,首先编号为1,4的人通过,编号为1的回来送火把,然后编号为2,3组队通过,编号为4的回来送火把,编号为1,4通过,结束。
Sum = 2 + 1 + 10 + 2 + 2 = 17。
来源
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int a[100000];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
int sum=0;
///四个人作为一组进行看待
///两种方式第一种:每次走都是一个最大的携带一个最小的,然后小的单独回来
///第二种方式:第一次携带最小的两个去然后小的回来,之后携带两个最大的去,然后携带上一次的第二小的回来,
while(n>3)
{
int sum1=2*a[0]+a[n-1]+a[n-2];
int sum2=a[0]+a[1]*2+a[n-1];
if(sum1<sum2)
sum+=sum1;
else
sum+=sum2;
n-=2;
}
if(n==1)
sum+=a[0];
if(n==2)
sum+=a[1];
if(n==3)
sum+=a[0]+a[1]+a[2];
printf("%d\n",sum);
}
return 0;
}