1 条题解
-
0
#include <bits/stdc++.h> using namespace std; int main() { // [1] 动态数组存储每个人的过河时间 vector<int> arr; // [2] 读取需要过河的人数 int n; cin>>n; // [3] 读取n个人的过河时间,存入数组 for(int i=0;i<n;i++){ long long a; cin>>a; arr.push_back(a); } // [4] 对过河时间进行升序排序,方便贪心策略计算 sort(arr.begin(),arr.end()); // [5] 初始化总时间和两种策略的时间变量 int sum=0,sum1=0,sum2=0; // [6] 当人数≥4时,循环处理最慢的两个人过河 while(n>=4){ // 策略1:最快的人往返送最慢的两人过河 sum1=2*arr[0]+arr[n-1]+arr[n-2]; // 策略2:最快的两人配合送最慢的两人过河 sum2=arr[0]+2*arr[1]+arr[n-1]; // 选择两种策略中耗时更少的一种,累加到总时间 sum+=min(sum1,sum2); // 每次处理2人,剩余人数减2 n=n-2; } // [7] 处理剩余人数不足4人的情况 if(n==1 ) sum+=arr[0]; // 仅1人时,直接过河 else if(n==2) sum+=arr[1]; // 2人时,一起过河,耗时为较慢者的时间 else sum+=arr[1]+arr[0]+arr[n-1]; // 3人时,最快的送最慢的过去再回来,再和次快的一起过去 // [8] 输出所有人过河的最短时间 cout<<sum; return 0; }
- 1
信息
- ID
- 1045
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者