zoukankan      html  css  js  c++  java
  • POJ 2573 Bridge 【模拟+分治】

    题目:

    n人希望在晚上过河。 最多两人可以组成一组一起过河,每组必须有手电筒。 在n个人中只有一个手电筒,所以必须安排过河顺序,以便及时返回手电筒使得更多的人可以过河。
    每个人的过河速度都不同; 每一组的速度由较慢成员的速度决定。 你的任务就是确定一个方案,让所有的人在最短的时间内过河并且输出方案。

    分析:

    此题其实本来是没有思路的,但是 ,通过排序,我们发现:既然每次都得一个人传递手电筒,为什么不让最快的那个人传呢(其实同时需要a[1],a[2]两个人配合,详见方案2)?又因为能者多劳,因此每次借助a[1],a[2]把最慢的两位带到对岸,而最快的两位最后过河(经过简单的贪心分析,不难看出这种决策是最优的),经排序,我们每次把 a[1],a[2],a[n-1],a[n]分成一组,使用“好学生带坏学生的思想”,于是就有了这样的思路:

    方案1:只借助a[1]帮a[n-1],a[n]过河;

          1、a[1]带a[n]过河 ==> a[n]

          2、a[1]回去 ==> a[1]

          3、a[1]带a[n-1]过河 ==> a[n-1]

          4、a[1]归还手电 ==> a[1]

    总时间:a[n]+a[n-1]+2*a[1]--------©

    方案2:同时借助a[1]和a[2]帮a[n-1],a[n]过河;

          1、a[1]和a[2]过河 ==> a[2]

          2、a[1]回去 ==> a[1]

          3、a[1]把手电给a[n-1]和a[n],a[n]和a[n-1]过河 ==> a[n]

          4、a[2]归还手电 ==> a[2]

    总时间:a[n]+2*a[2]+a[1]-----------®

    于是每次在决策的时候只要比较©和®的大小就好啦,先决策,输出总时间,再输出步骤。

    参考代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int n,ans=0;
    int a[1010]; 
    
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        if(n==1)
        {
            printf("%d
    %d
    ",a[1],a[1]);
            return 0;        
        }
        int nn=n;
        sort(a+1,a+n+1);
        while(n>3)
        {
            if(a[1]+a[n-1]<2*a[2])
                ans+=a[n]+a[1]*2+a[n-1];
            else
                ans+=a[2]*2+a[1]+a[n];
            n-=2;
        }
        if(n==2) ans+=a[2];
        else ans+=a[1]+a[2]+a[3];
        printf("%d
    ",ans);
        n=nn;
        while(n>3)
        {
            if(a[1]+a[n-1]<2*a[2])
                printf("%d %d
    %d
    %d %d
    %d
    ",a[1],a[n],a[1],a[1],a[n-1],a[1]);
            else
                printf("%d %d
    %d
    %d %d
    %d
    ",a[1],a[2],a[1],a[n-1],a[n],a[2]);//记住要交还手电筒 
            n-=2;
        }
        if(n==2) printf("%d %d
    ",a[1],a[2]);
        else
            printf("%d %d
    %d
    %d %d
    ",a[1],a[3],a[1],a[1],a[2]); 
        return 0;
    }
  • 相关阅读:
    Intent
    What should we do next in general after collecting relevant data
    NOTE FOR Secure Friend Discovery in Mobile Social Networks
    missing pcap.h
    after building Android Source code
    plot point(one column)
    When talking to someone else, don't infer that is has been talked with others at first. It may bring repulsion to the person who is talking with you.
    进程基本知识
    Python input和raw_input的区别
    强制 code review:reviewboard+svn 的方案
  • 原文地址:https://www.cnblogs.com/linda-fcj/p/7220728.html
Copyright © 2011-2022 走看看