贪心-POJ 1700 过河问题

来源:互联网 发布:数据分析的方法 编辑:程序博客网 时间:2024/05/21 17:52
题意: 
n个人过河, 船每次只能坐两个人, 船载每个人过河的所需时间不同,过河时间以耗时间长的那个为实际耗时, 如何得出最快的过河时间。 
思路: 
1 每次最快和那些慢的过去,然后让最快一直来回,最后全部到对岸。
 
2 还有一种情况,你先让两个快的人从A过去至B,然后挑一个人回来至A,留下一个快的在B。OK,回来以后我让两个最慢的过去至B,然后让B那边的快的过来接A这边的快的。这样或许会省时一点。 


我们假设只有四个人,tf(the fast最快),sf(second fast次快),ss(second slower次慢),ts(the slower最慢)。O
第一种情况: 
tf兜来兜去的case: 
tf+ts–> 
<–tf 
tf+ss–> 
<–tf 
tf+sf–> 
第二种情况: 
tf+sf–> 
<–sf 
ts+ss–> 
<–tf 
tf+sf–> 

然后各类的时间消掉,会得出两种方案的最终比较:2*sf和tf+ss的比较; 

代码如下:

#include<stdio.h>void quicksort(int left,int right,int a[1005]){    int i,j,t,temp;    if(left>right)       return;    temp=a[left]; //temp中存的就是基准数    i=left;    j=right;    while(i!=j)    {                   //顺序很重要,要先从右边开始找                   while(a[j]>=temp && i<j)                            j--;                   //再找左边的                   while(a[i]<=temp && i<j)                            i++;                   //交换两个数在数组中的位置                   if(i<j)                   {                            t=a[i];                            a[i]=a[j];                            a[j]=t;                   }    }    //最终将基准数归位    a[left]=a[i];    a[i]=temp;    quicksort(left,i-1,a);//继续处理左边的,这里是一个递归的过程    quicksort(i+1,right,a);//继续处理右边的 ,这里是一个递归的过程}int main(){    int i,T,N,time[1005];    int totle;    scanf("%d",&T);    while(T--)    {        totle=0;        scanf("%d",&N);        for(i=1;i<=N;i++)            scanf("%d",&time[i]);        quicksort(1,N,time);        if(N==1)            printf("%d\n",time[1]);        else if(N==2)            printf("%d\n",time[2]);        else if(N==3)            printf("%d\n",time[3]+time[1]+time[2]);        else        {            for(i=N;i>3;i-=2)            {                if(2*time[2]>time[1]+time[i-1])                {                totle+=2*time[1]+time[i]+time[i-1];                }                else                totle+=2*time[2]+time[i]+time[1];            }            if(i==3)                totle+=time[3]+time[1]+time[2];            else if(i==2)                totle+=time[2];            printf("%d\n",totle);        }    }    return 0;}

体会:遇到这种因素会变的题目(人数),应当一种一种情况分开讨论,有相同规律的用相同的手法解答,把大问题放小了看,只看眼前,贪心一点,例如当多于5个人时,我就只看4个人。