傳送門: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;
}