码迷,mamicode.com
首页 > 其他好文 > 详细

渡河问题

时间:2021-04-07 11:00:05      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:题目   mes   else   inf   info   alt   include   技术   mamicode   

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

学习一下渡河问题

一队人(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;
}

 

渡河问题

标签:题目   mes   else   inf   info   alt   include   技术   mamicode   

原文地址:https://www.cnblogs.com/Dancing-Fairy/p/14619441.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!