codeforces 158B
题意
给很多队人,每一队人有不同的人数,用一辆出租车将他们全部送走。题目要求求最小的出租车的数量,因为一辆出租车只能载4个人,所以要找出最优的方案来解决这个问题
思路
用数学、桶来做,或贪心
如果用贪心的话,先不管别的,首先对数据数组排序,
· 将排序后的数组最大的和最小的加在一起,如果值<=4,则下一次不用考虑最大和最小的队伍,载人次数+1
· 因为此时车还没载满,所以根据贪心原则,还要看看能不能再载一队,这时再加上最末尾的最小的人数,载人次数不变
· 如果排序后的数组中最大和最小的加在一起>4,则将最大的一队先送走,下次不用考虑这队,载人次数+1
方案1(桶,数学)
#include<iostream>
using namespace std;
int A[5],N,i,t;
int main(){
cin>>N;
while(cin>>t)A[t]++;
A[1]=max(A[1]-A[3],0);
cout<<A[3]+A[4]+(A[1]+2*A[2]+3)/4;
}
方案2(贪心)
#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()
{
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++;//如果最大值加最小数>4,车数+1,队伍-1(这时队伍从左边减,也就是减最大值,相当于i++)
}
cout<<ans;
return 0;
}
日昭昭月姣姣初心无悔,山迢迢路遥遥勇敢追,夜幕的星山顶的灯,信步相随…