zoukankan      html  css  js  c++  java
  • 过河问题

    过河问题
    时间限制: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
    来源
    POJ

    解题思路:
      首先按照过河时间从小到大排序,当n>3时候,就是考虑用最小时间先把用时最长的两个人送过河,
    且手电筒仍然留在未过河的这边,剩下的再依次求解。

    把当前用时最长的两个人送过河可以考虑两种方案:
    方案一:
      1 号和 2 号先过河,然后 1 号回来,n 号和 n-1 号过河,然后 2 号再回来
    用时:2*a[2]+a[1]+a[n];
    方案二:
      1 号和 n 号先过河,然后 1 号再回来,1 号和 n-1 号再过河,之后 1 号再回来
    用时:a[n]+a[n-1]+2*a[1];

      所以每次把用时最长的两个人送过河用时应该取上述两种方案中的最小值。至于为什么要先考虑
    把用时最长的两个人送个和用的是贪心的思想,因为只有两个用时最长的两个人一块过河才能保证
    用时次长的人不会占用过河时间,将时间降到最低.

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    const int Max=101010;
    int main()
    {
        int _case;
        int n,ans,m;
        int i,j;
        int temp1,temp2;
        int a[Max];
        scanf("%d",&_case);
        while(_case--)
        {
            scanf("%d",&n);
            for(i=1;i<=n;i++)
                scanf("%d",&a[i]);
            sort(a+1,a+n+1);
            ans=0;
            m=n;
            while(m>3)
            {
                temp1=2*a[2]+a[1]+a[m];
                temp2=a[m]+a[m-1]+2*a[1];
                //printf("#%d %d
    ",temp1,temp2);
                if(temp1<temp2)
                    ans+=temp1;
                else ans+=temp2;
                m-=2;
            }
            if(m==3)
                ans+=a[3]+a[2]+a[1];
            else if(m==2)
                ans+=a[2];
            else ans+=a[m];
            printf("%d
    ",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    element-ui 多张图上传
    js json生取key,value 值
    iview DatePicker 回显验证报错
    iview的Select控制value为数字类型时表单验证无法通过
    iview 自定义树形
    tree 树形递归修改 key
    根据月份选择 生成这个月的每一天
    微信小程序超出隐藏省略号和自动换行
    uni-app picker select 取想要的值
    element-ui 表格fixed 样式修改
  • 原文地址:https://www.cnblogs.com/XDJjy/p/3631387.html
Copyright © 2011-2022 走看看