POJ1700 -- 贪心算法

来源:互联网 发布:mac制作启动u盘 编辑:程序博客网 时间:2024/05/21 19:06

一。贪心策略:用最少的时间过河

 

二。过河方法分析:有俩种方法将最慢的那俩个人送过河。

eg:1 2 5 10

方法1:每次最快的1和次快的2过河,然后最快的1回来,最慢的10和次慢的5过河,最快的2再回来。

            此时花费的时间为method1:2+1+10+2;公式为:a[0]+2*a[1]+a[i]    (备注:数组a[ ]是从小到大有序排列 )

方法2:每次最快的1和最慢的10过河,最快的1回来,再和次慢的5过河,最快的1再回来。

            此时花费的时间为method2:10+1+5+1;公式为:2*a[0]+a[i-1]+a[i]

每次过河的时候,对方法1的时间和方法2的时间进行比较,选择最快的方法过河。

最后的结果都是,最慢的那俩个过河。

 

三。代码分析:

1. 将输入的速度数组按从小到大进行排序。

2. 当只有一个人和只有俩个人的情况,需要特殊处理。

 

#include <stdio.h>#include <stdlib.h>int speed[1000];int output=0;void Greedy(int* a, int N){    int i=0,j=0;    for(i=N-1;i>0;i=i-2){        if(i==1){            output+=a[1];        }else if(i==2){            output+=a[0]+a[1]+a[i];        }else {            int method1 = a[0]+2*a[1]+a[i];            int method2 = 2*a[0]+a[i-1]+a[i];            if(method1 < method2){                output += method1;            }else{                output += method2;            }        }    }}int main(){    int T, N ;    //freopen("input.txt","r",stdin);    scanf("%d",&T);    int i=0;    for(i=0;i<T;i++){        memset(speed,0,sizeof(speed));        output=0;        scanf("%d",&N);        int j =0;        for(j=0;j<N;j++){            scanf("%d",&speed[j]);  //获取int型数组,加&地址。数组名是该数组首元素的地址,故获取        }        if(N==1){            printf("%d\n",speed[0]);        }else if(N==2){            printf("%d\n",speed[1]);;        }else{            fastsort(speed,0,N-1);            Greedy(speed,N);            printf("%d\n",output);        }    }    return 0;}


 

0 0
原创粉丝点击