Crossing River poj1700贪心

题目描述:N个人过河,只有一只船,最多只能有两人划船,每个人划船速度不同,船速为最慢的人的速度。输入T为case个数,每个case输入N为人数,接下来一行输入的是每个人过河的时间,都不相同。要求输出N个人全部过河的时间

算法思想:采用贪心的方法。有两种划船的方法,一种是最快+最慢,最快回,最快+次慢,最快回,循环下去;第二种是最快+次快,次快回,最慢+次慢,最快回,循环下去。那么当剩余人数N>3的时候,比较第一种和第二种的时间,采用耗时短的方法过河。N=1,2,3的时候单独讨论。

#include<iostream>

#include<stdio.h>

#include<algorithm>

#include<string.h>

using namespace std;

int pt[1010];  //store time of people

int main(){

    int T;

    scanf("%d",&T);

    while(T--){

        int N;

        scanf("%d",&N);

        memset(pt,0,sizeof(pt));

        for(int i=0;i<N;i++){

            scanf("%d",pt+i);

        }

        sort(pt,pt+N);

        int t=0;

        while(N>3){

            if(2*pt[1]+pt[0]>2*pt[0]+pt[N-2]){

                t+=2*pt[0]+pt[N-1]+pt[N-2];

            }

            else{

                t+=2*pt[1]+pt[N-1]+pt[0];

            }

            N-=2;

        }

        if(N==3){

            t+=pt[2]+pt[0]+pt[1];

        }

        else if(N==2){

            t+=pt[1];

        }

        else{

            t+=pt[0];

        }

        printf("%d\n",t);

    }

    return 0;

}

 

你可能感兴趣的:(poj)