过河问题

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值