您的位置:首页 > 其它

SDUT2868_n人过河问题(贪心)

2014-05-30 19:16 169 查看





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。


来源

 解题报告

贪心。。。论证过程详解http://blog.csdn.net/michael_jordaner/article/details/27261037

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
int i,j,n,num[1000],a,b,y,z;
while(cin>>n)
{
for(i=0; i<n; i++)
cin>>num[i];
sort(num,num+n);
int sum=0;
while(n>=4)
{
a=num[0];
b=num[1];
y=num[n-2];
z=num[n-1];
if(2*b<y+a)
{
sum+=2*b+a+z;
n-=2;
}
else
{
sum+=a*2+z+y;
n-=2;
}
}
if(n==3)sum+=num[0]+num[1]+num[2];
else if(n<=2)sum+=num[n-1];
cout<<sum<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: