过河问题

来源:互联网 发布:机器人离线编程 编辑:程序博客网 时间:2024/05/20 22:02

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);}
原创粉丝点击