• nyoj 47——过河问题——————【贪心】


    过河问题

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:5
     
    描述

    在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这N人尽快过桥。 

     
    输入
    第一行是一个整数T(1<=T<=20)表示测试数据的组数
    每组测试数据的第一行是一个整数N(1<=N<=1000)表示共有N个人要过河
    每组测试数据的第二行是N个整数Si,表示此人过河所需要花时间。(0<Si<=100)
    输出
    输出所有人都过河需要用的最少时间
    样例输入
    1
    4
    1 2 5 10
    样例输出
    17


    解题思路:

    /*
    先把时间排序。
    其实每次过桥留在对面的是a[n-1]和a[n-2]。其他人过去只是个媒介.
    两种方式可以每次过去两个人:每次让n-=2。
    方法1:a[0]和a[1]过去,a[0]回来。a[n-1]和a[n-2]过去,a[1]回来。
    方法2:a[0]和a[n-1]过去,a[0]回来。a[0]和a[n-2]过去,a[0]回来。
    对方法1和方法2进行贪心。
    如果n是大于3的奇数,经过几个来回过桥。则最后剩3个人。只需方法1和方法2去掉最后
    那个回来的步骤就可以保证过去三个人。
    如果n是大于3的偶数,经过几个来回过桥。则最后剩2个人。只需要加上a[1]即可。
    所以可以初始化sum=a[1]。最后只需对于剩3人的进行操作即可。
    */

    #include<bits/stdc++.h>
    using namespace std;
    #define min(a,b) ((a)<(b)?(a):(b))
    int a[1010];
    int main(){
        int t,i,j,k,n,m,sum,tmp;
        scanf("%d",&t);
        while(t--){
            scanf("%d",&n);
            for(i=0;i<n;i++)
                scanf("%d",&a[i]);
            sort(a,a+n);
            if(n<3){
                printf("%d
    ",a[n-1]);
                continue;
            }
            sum=a[1];
            while(n>3){
                tmp=min((a[n-1]+a[0]+a[n-2]+a[0]),(a[1]+a[0]+a[n-1]+a[1]));
                sum+=tmp;
                n-=2;
            }
            if(n==3)
                printf("%d
    ",sum+a[0]+a[2]);
            else printf("%d
    ",sum);
        }
        return 0;
    }
    

      

  • 相关阅读:
    Probability theory
    python Memo
    numpy 札记
    linux LVM 逻辑卷
    关于TF-IDF的一些见解
    Python之list、dict、np等常用数值运算
    Python之matplotlib绘图
    Python之打开网页
    Python之获取地址经纬度
    两台电脑直接共享文件
  • 原文地址:https://www.cnblogs.com/chengsheng/p/4627516.html
Copyright © 2020-2023  润新知