zoukankan      html  css  js  c++  java
  • 1700 Crossing River

    题目链接: http://poj.org/problem?id=1700

    1. 当1个人时: 直接过河 t[0].

    2. 当2个人时: 时间为较慢的那个 t[1].

    3. 当3个人时: 时间为 t[0]+t[1]+t[2].

    4. 当4个以上的人时, 将t[0] 和 t[1]当作搬运工. 两种方案:

      - 最快和次快的过去, 最快的回来, 最慢和次慢的过去, 次快的回来, 这样就将最慢和次慢的送过去了. 时间: t[0]+2*t[1]+t[i]

      - 最快的依次送最慢和次慢的过去再回来, 时间: 2*t[0]+t[i-1]+t[i]

      以上方案每次就将最慢的和次慢的送过河, 每次送走两个人, 当将其他人送完之后, t[0]和t[1]再过河.

    #include <iostream> 
    #include <algorithm> 
    using namespace std;
    bool comp(int a,int b){
        return a<b;
    }
    int main(){
        int m,n,t[10001],i,sum;
        cin>>m;
        while(m--){
            cin>>n;
            sum = 0;
            for(i=0;i<n;++i)
                cin>>t[i];
            sort(t,t+n,comp);
            for(i=n-1;i>2;i-=2){
                //把t[0]和t[1]当成搬运工,最后返回到原地
                int t1 = t[0]+2*t[1]+t[i];//最快的(即所用时间t[0])和次快的过河,然后最快的将船划回来,再次慢的和最慢的过河,然后次快的将船划回来
                int t2 = 2*t[0]+t[i-1]+t[i];//最快的和最慢的过河,然后最快的将船划回来,再最快的和次慢的过河,然后最快的将船划回来
                sum += t1>t2?t2:t1;
            }
            if(i==2) //3people left
                sum += t[0]+t[1]+t[2];
            else if(i==1) //2 people left
                sum += t[1];
            else  // 1 people left
                sum += t[0];
            cout<<sum<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    O052、Create Volume 操作 (Part III)
    O051、Create Volume 操作 (Part II)
    O050、Create Volume 操作 (Part I)
    O049、准备 LVM Volume Provider
    O048、掌握 cinder-scheduler 调度逻辑
    O047、 Cinder 组件详解
    O046、掌握Cinder 的设计思想
    O045、理解 Cinder 架构
    O044、一张图秒懂 Nova 16种操作
    O043、计算节点宕机了怎么办
  • 原文地址:https://www.cnblogs.com/roger9567/p/4887716.html
Copyright © 2011-2022 走看看