贪心算法-过河问题
贪心算法-过河问题
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;
}
作者:newcode 更多资源请关注纽扣编程微信公众号

从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习

浙公网安备 33010602011771号