求助
查看原帖
求助
257635
XAKXIANGAKIOI楼主2020/9/10 21:21
#include <bits/stdc++.h>
using namespace std;
int n, ans, s[1000007], f[1000007];
int Time(int n){
	if(n == 1) return s[1];
	else if(n == 2) return s[2];
	else if(n == 3) return s[1] + s[2] + s[3];
	else{
		int T1 = s[n] + s[n-1] + 2 * s[1];
		int T2 = 2 * s[2] + s[1] + s[n];
		ans += min(T1, T2) + Time(n - 2);
	}
}
int main(){
	// 当n=1,2,3时,答案显而易见
	// 当n=4时,有两种策略 :
	// 1 :最快的依次送所有人
	// 2 :最快的和次快的先过河,最快的回来,两个最慢的过河,次快的把船开回来
	// 当 n != 4时, 则每次送走最慢的两个, 使用当前最优方案,直到 n < 4 
		scanf("%d", &n);
		for(int i=1;i<=n;i++) scanf("%d", &s[i]);
		sort(s+1,s+n+1);
		Time(n);
		printf("%d\n", ans);
	return 0;
}
2020/9/10 21:21
加载中...