[poj] 1700 Crossing River

来源:互联网 发布:潮流相机软件 编辑:程序博客网 时间:2024/05/22 03:32

[poj] 1700 Crossing River

【题目】http://poj.org/problem?id=1700

【题意】求过河最少时间

【算法】贪心

【题解】首先最慢的人过河花费最多的时间。然后船回来的时候花费时间尽可能少。可以考虑最慢和次慢一起过河,最快和次快负责分别送船回来。也可以考虑每次都是由最快接送。哪种方案呢?在用之前比较好哪个少就好了。所以就这样写,一开始最快a0和次快a1的过河了,然后最快回来,然后选择方案,最慢an,次慢an-1;比较花费时间an+a2+a2(最慢和次慢一起过河,次快送船回来,然后和最快一起再过河)和an+a1+an-1(最慢和最快过河,最快送船回来,次慢和最快再过河)。

【注意】不好想唉

【测试数据】

3

 
4
1 2 5 10
 
4
1 4 5 10
 
3

1 1 1

Ans:

17

21

3

【AC代码】

#include<iostream>

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

 

int a[1010];

 

int main(){

    int T;

    int n,i,t;

    scanf("%d",&T);

    while(T-->0){

        scanf("%d",&n);

        for(i=0;i<n;i++)scanf("%d",&a[i]);

        if(n==1){

            printf("%d\n",a[0]);

            continue;

        }

        sort(a,a+n);

        t=a[1];

        for(n--;n>1;n--){

            t+=a[0];

            if(a[n]+a[0]+a[n-1]<=a[n]+a[1]+a[1])t+=a[n];

            else t+=a[n--]+a[1]+a[1];

        }

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

    }

    return 0;

}

【心得】我要坚持做黑书,我要坚持看英语。加油!我还要提高效率!
原创粉丝点击