NYOJ_47 过河问题,贪心选择

来源:互联网 发布:not在vb中 编辑:程序博客网 时间:2024/05/01 05:38

http://acm.nyist.net/JudgeOnline/problem.php?pid=47

在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这N人尽快过桥。 

 

思路:按耗时排序后,每次先让最快的两个人AB过去,回来一个A,让这边最慢的两个人过去,回来B,这样方案形成的格局就是剩下的人耗时最少,传递手电筒耗时也是最少,如此循环,直到剩余小于4个人。

提交后结果WA了,少考虑情况了,比如最快的AB,B却比A慢得多,这样就不如两次都让A传递手电筒。

参考了这里才发现这点的

分析:每一轮让最快的两个人先过桥,最快的一个人拿手电回来,然后这边最慢的两人先过去,桥那边最快的一个人回来类推

补充:其实还没有考虑完全,比如 下面一个例子:1,5, 7, 12

按上面的方面,当7, 12到对面共花了23

但是如果1带7过去,1 回带12过去,1回,确只用了21


#include<cstdio>#include<algorithm>using namespace std;int mintime(int n,int *a){    sort(a,a+n);    int res=0;    --n;    while(n>2)    {        res+=min(a[0]+a[1]*2+a[n],a[0]*2+a[n]+a[n-1]);        n-=2;    }    if(n==0)        res+=a[0];    else if(n==1)        res+=a[1];    else        res+=a[0]+a[1]+a[2];    return res;}int main(){    int i,n,t,a[1001];    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        for(i=0;i<n;++i)            scanf("%d",&a[i]);        printf("%d\n",mintime(n,a));    }    return 0;}





原创粉丝点击