贪心算法-过河问题

贪心算法-过河问题
https://www.luogu.com.cn/problem/P1809

/* 
1个 a1
2个 a1+a2
3个 a3+a1+a2
>3 运输左边用时最长的两个人去右边 有两种最优方案 取最小 
4个 
左 a1 a2 a3 a4   右 
a1和a4  --a4  左    a2 a3   右  a1 a4 
a1回来  --a1  左 a1 a2 a3   右   a4 
a1和a3  --a3  左    a2      右   a1 a3 a4  
a1回来  --a1  左 a1 a2      右   a3 a4  

ans=a1*2+a3+a4

左 a1 a2 a3 a4   右
a1 a2   --a2  左    a3 a4   右  a1 a2
a1回来  --a1  左 a1 a3 a4   右     a2
a3和a4  --a4  左 a1         右     a2 a3 a4
a2回来  --a2  左 a1 a2      右        a3 a4 

ans=a1+a2*2+a4
*/
#include<bits/stdc++.h>
using namespace std;
int N;
const int MAXN=100000+10;
int a[MAXN],ans;
int main(){
	cin>>N;
	for(int i=1;i<=N;i++){
		cin>>a[i];
	}
	sort(a+1,a+N+1);//从小到大排序 
	while(N>3){//运输左边用时最长的两个人去右边 有两种最优方案 取最小
		ans+=min(a[1]*2+a[N]+a[N-1],a[1]+a[2]*2+a[N]);
		N-=2;
	}
	if(N==2) ans+=a[2];//最后剩余2人情况 
	if(N==3) ans+=a[1]+a[2]+a[3];//最后剩余3人情况 
	cout<<ans;
	return 0;
}
posted @ 2022-09-01 19:04  new-code  阅读(58)  评论(0)    收藏  举报