Poj 1700 Crossing River

      很经典的过桥问题。额,所以就不解释题意了。

思路:当n <= 3 时,都视为特殊情况,处理就不用说了。当 n>= 4 时,有两种较优的过桥方式。

设最快的人为a[0],次快的人为a[1],最慢的和次慢的为a[n-1],a[n-2]。

① 最快的人和最慢的走,再回去和次慢的一起走,再单独回去。耗时:a[n-1]+a[0]+a[n-2]+a[0];

        ② 最快和次快先走,最快回去,最慢和次慢的过桥,然后次快的回去。耗时:a[1]+a[0]+a[n-1]+a[1];

每次两者取最优解。最快和次快的人一直在做苦力.......

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <climits>
using namespace std;
#define MAX 1050
#define INF 0x7FFFFFFF
int men[MAX];
int main()
{
    int t,n,i,j;
    int total=0;
    scanf("%d",&n);
    for(i=0; i<n; i++)
        scanf("%d",&men[i]);
    sort(men,men+n);//时间由少到多排序
    while(n-3>0)
    {
        if(men[1]*2>men[n-2]+men[0])//if else 两者取最优解:两种可能的最短时间取短的
            total+=men[0]*2+men[n-1]+men[n-2];
        else total+=men[1]*2+men[0]+men[n-1];
        n-=2;//一次两个人
    }
    //以下特例,枚举即可
    if(n==3)
        total+=men[0]+men[1]+men[2];
    if(n==2)
        total+=men[1];
    if(n==1)
        total+=men[0];
    cout<<total<<endl;
    return 0;
}


你可能感兴趣的:(Poj 1700 Crossing River)