SDUT 2868 贪心(最短时间过河问题)

来源:互联网 发布:在线答题的软件 编辑:程序博客网 时间:2024/05/22 18:24

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

n个人要过一座桥,只是在漆黑的夜里,没有火把显然是不行的。但是这n个人只有一个火把,并且这座桥每次最多只能通过两个人。
每个人的速度不同,若两人组队,队伍速度等于较慢一人的速度。你要做的是计算这n个人全部通过这座桥的最少时间。

输入

多组输入。每组数据的第一行是输入一个n,代表有n(1 <= n && n <= 500)个人,接下来的n个整数,代表着每个人穿过这座桥所需要的时间。

输出

输出一个整数,代表最优策略所需时间。

示例输入

411052

示例输出

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;}


0 0
原创粉丝点击