过河问题

QAQ
先假设有4个人
四人所需要的时间分别是1、2、5、8分钟
策略1:让最小的送最大的,尽量减少回来的时间
先让甲乙过去(2分钟),甲回来(1分钟),甲丙过去(5分钟),甲回来(1分钟),甲丁再过去(8分钟),总共需要17分钟就可以让四个人都过去。
策略2:让最慢的两个人同时过桥,让已经过桥的人来担负送手电筒的责任
而正确答案是第二种办法:先让甲乙过去(2分钟),甲回来(1分钟),丙丁过去(8分钟),乙回来(2分钟),甲乙再过去(2分钟),总共需要15分钟就可以让四个人都过去。

所以说策略二最优?
不存在的!
把四人所需要的时间,改变一下分别,是1、4、5、8分钟。

  第一种方法:先甲乙过去(4分钟),甲回来(1分钟),甲丙过去(5分钟),甲回来(1分钟),甲丁再过去(8分钟),总共需要19分钟就可以让四个人都过去。

  第二种方法:先让甲乙过去(4分钟),甲回来(1分钟),丙丁过去(8分钟),乙回来(4分钟),甲乙再过去(4分钟),总共需要21分钟就可以让四个人都过去。

这一次,两个最慢的人一起过去反而更慢了。

这两次方案的差异:次快的人要不要也传递一次手电筒。

到最后正确的贪心是!
两个方案取min


大于4时可以用4的方法贪三个人的,直到变成<4的为止。

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int a[199999];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
     scanf("%d",a+i);
    sort(a+1,a+n+1);
    int ans=0;
    while(n>=4)
    {
        ans+=min(a[1]+2*a[2]+a[n],2*a[1]+a[n]+a[n-1]);
        n-=2;
    }
    if(n==3)
     ans+=a[1]+a[2]+a[3];
    if(n==2)
     ans+=a[2];
    if(n==1)
     ans+=a[1]; 
    printf("%d",ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值