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

 

posted on 2015-04-16 16:12  jxzheng  阅读(174)  评论(0编辑  收藏  举报

导航