• 渡河问题


    昨天第一次做腾讯的笔试,第一题题目意思我实在理解不了,第二题挺简单的,第三题是经典的“渡河问题”

    学习一下渡河问题

    一队人(N个人)期望跨河,有一条船,一次只能载2个人,过河之后需要有一个人划回来,所有人才能够跨河,每个人划船速度都不同,两个人一组整体速度是由划船速度较慢的决定的。问题:确定一种策略用最少的时间所有人都能过河。

    样例:
    输入:
    4
    1 2 5 10
    输出
    17

    我在笔试的时候只想到了分两种情况考虑,但是细节没有处理好。

    四个人按渡河时间从小到大排序 a, b, c, d, 共有 a + 3b + d 和 2a + b + c + d两种情况, 如下图:

    (图中假设人初始时都在左边)

    这样我们每次只考虑把 c 和 d 送到对面去的开销,最后只剩下少于4人的情况时再单独讨论。

    #include<iostream>
    #include<vector>
    using namespace std;
    
    int main(){
        int n;
        cin >> n;
        vector<int> arr(n, 0);
        for(int i = 0; i < n; i++){
            cin>>arr[i];
        }
        int left = n;
        int cost = 0;
        while(left > 0){
            if(left == 1){
                cost += arr[0];
                break;
            }else if(left == 2){
                cost += arr[1];
                break;
            }else if(left == 3){
                cost += arr[0] + arr[1] + arr[2];
                break;
            }else{
                int s1 = arr[0] + arr[1] * 2 + arr[left - 1];
                int s2 = arr[0] * 2 + arr[left - 1] + arr[left - 2];
                cost += min(s1, s2);
                left -= 2;
            }
        }
        cout<<cost<<endl;
        return 0;
    }
  • 相关阅读:
    Vijos1986
    vijos1790
    洛谷1005
    洛谷3381
    bzoj4034
    bzoj1564
    bzoj2648
    洛谷3348
    jzoi4964
    codevs3990
  • 原文地址:https://www.cnblogs.com/Dancing-Fairy/p/14619441.html
Copyright © 2020-2023  润新知