codeforce 158B (貪心)

傳送門:http://codeforces.com/problemset/problem/158/B

題意分析:

就是給很多隊人,每一隊人有不同的人數,用一輛出租車將他們全部送走。題目的要求是求出最小的出租車的載人次數,因爲一輛出租車一次只能載4個人,所以要找出最優的方案來解決這個問題,顯而易見是個貪心問題。

具體思路:

碰到貪心問題,先不管別的,首先對數據數組進行排序,方便後續問題的處理。最優的方案是:

  • 將排序後的數組中最大的和最小的加在一起,如果值<=4,則下一次不用考慮最大和最小的隊伍,載人次數+1
  • 因爲此時車還沒載滿,所以根據貪心原則,還要看看能不能再載一隊。這時再加上最末尾的最小人數,載人次數不變,
  • 如果排序後的數組中最大和最小的加在一起 > 4,則將最大的一隊先送走,下次不用考慮這隊,載人次數+1

源代碼

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int a[maxn];

bool cmp(const int& a,const int& b) {
	return b<a;
}

int main(void){
	int n;cin>>n;
	for(int i = 0;i < n;i++) cin>>a[i];
	sort(a,a+n,cmp);
	int ans = 0;
	
	for(int i = 0;i < n;i++){
		int sum = a[i] + a[n-1];
		if(sum <= 4)		//如果最大加最小數小於4,車數+1,隊伍減2;
		{
			ans++;
			n--;
			while(sum + a[n-1] <= 4)
			{
				n--;
				sum+=a[n-1];		//如果還有座位則繼續加最小的,如果小於4,隊伍減1,車數不變
			}	
		}
		else ans++;		//如果最大加最小數大於1,車數+1,隊伍-1(這時隊伍減1減的數組的左邊,這裏相當於i++)。 
	}	
	cout<<ans;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章