昨天第一次做腾讯的笔试,第一题题目意思我实在理解不了,第二题挺简单的,第三题是经典的“渡河问题”
学习一下渡河问题
一队人(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; }