POJ1700 -- 貪心算法

一。貪心策略:用最少的時間過河

 

二。過河方法分析:有倆種方法將最慢的那倆個人送過河。

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;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章