题意:
n个人要从a到b,每个人过河需要的时间不同,,只有一根绳子,每次过河需要一根绳子,每次最多只能同时过两人,,,如果同时过两人,过河时间取两人中最大的。
思路:
按过河时间排序后
有两种最优策略:
1.最轻的带最重的过去,
2.两个最轻的带两个最重的过去
每次判断两人,比较两种策略哪个更优。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll arr[100001];
int main()
{
int n;
cin>>n;
for(int i = 0;i<n;i++)
scanf("%lld",&arr[i]);
sort(arr,arr+n);
ll ans = 0;
if(n==1)
{
ans = arr[0];
}
else
{
if(n&1)
{
ans += arr[0]+arr[1]+arr[2];
for(int i = 4;i<n;i+=2)
{
ans += min(arr[0]*2+arr[i]+arr[i-1],arr[0]+arr[1]*2+arr[i]);
}
}
else
{
ans += arr[1];
for(int i = 3;i<n;i+=2)
{
ans += min(arr[0]*2+arr[i]+arr[i-1],arr[0]+arr[1]*2+arr[i]);
}
}
}
printf("%lld",ans);
return 0;
}