传送门: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;
}