标签:break arr int else 问题 渡河 cost left
昨天第一次做腾讯的笔试,第一题题目意思我实在理解不了,第二题挺简单的,第三题是经典的“渡河问题”
学习一下渡河问题
一队人(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; }
标签:break,arr,int,else,问题,渡河,cost,left 来源: https://www.cnblogs.com/Dancing-Fairy/p/14619441.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。