P1809 过河问题
#include<iostream>
#include<algorithm>
#include<string>
#include<math.h>
#include<limits.h>
using namespace std;
long long a[100005];
long long dh(long long a[],int n)
{
long long sumt=0;
int m=n;//未渡河的人数
while(m>=1)
{
if(m==1)
{
sumt+=a[1];
break;
}else if(m==2)
{
sumt+=a[2];
break;
}else if(m==3)
{
sumt+=a[1]+a[2]+a[3];
break;
}else{
int a1=a[m]+a[1]+a[m-1]+a[1];//让最快的人带最慢的人过去,再回来
int a2=a[2]+a[1]+a[m]+a[2];//让最快两人先过去,第一快的先回来,再让最慢的两人过去,然后,让第二快的人回来
sumt+=min(a1,a2);
m-=2;//有两人以已经渡河成功
}
}
return sumt;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a,a+n+1);
cout<<dh(a,n);
return 0;
}
学习视频
贪心渡河问题_哔哩哔哩_bilibili