Safe Passage-----------------------------------思維(經典貪心過河問題)

在這裏插入圖片描述
在這裏插入圖片描述
解析:
經典過河問題
N個人,只有一條船,每個人都有一個划船速度,要求讓N個人過河,一次渡河包括兩個人先過去,一個人再回來。每次時間取兩個人之間用時最多的,一個人的時候的時間就是他自己所用的。求讓N個人過完河所用的最短時間。

思路:
先按照時間由短到長排序 分情況討論

第一種情況 最快的依次把最慢,次慢送過去 耗費 t[n]+t[1]+t[n-1]+t[1]
第二種情況 最快的和次快的先過去 那麼耗費 t[2] 然後最快的回來 耗費 t[1] 。然後最慢和次慢一起過去,耗費 t[n] 。最後再讓次快的回來耗費 t[2]
所以總耗費 2*t[2]+t[1]+t[n]

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+1000;
int n;
int a[N];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+1+n);
	int ans=0;
	while(n) 
	{
		if(n==1) {ans+=a[1];break;}
		else if(n==2) {ans+=a[2];break;}
		else if(n==3){ans+=a[1]+a[2]+a[3];break;}
		else
		{
			ans+=min(2*a[1]+a[n]+a[n-1],a[2]+a[1]+a[n]+a[2]);
			n-=2;
		}
		
		
	}
	cout<<ans<<endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章