描述
今天是小A的生日,小A在家里举行了一次生日宴会,并邀请了他的朋友来参加。小A的交友很广,所以小A在n个领域都有朋友(律师朋友,医生朋友等等...)
每个领域的朋友为个数si(1<=si<=4)。他们都一同乘坐出租车来到小A的聚会。但是,每辆出租车最多只能容得下四位乘客,并且相同领域的朋友还必须得坐同一辆出租车,那么最少需要搭乘多少辆出租车呢?(同一辆出租车是可以搭乘多个领域的朋友的)
输入
输入包含多组。输入第一行为一个n(1<=n<=10^5),代表有n个领域的朋友来参加小A的生日宴会。第二行包含n个数,s1,s2,...,sn(1<=si<=4),si代表第i个领域的朋友个数。
输出
输出最少需要搭乘的出租车数量。
样例输入1
5 1 2 4 3 3
样例输出1
4
样例输入2
8 2 3 4 4 2 1 3 1
样例输出2
5
提示
对于第一组样例的解释:
有5个领域的朋友,分别有1,2,4,3,3个人。这样的搭乘方案:第一辆出租车搭乘第一个领域和第二个领域的朋友(1+2<4),第二辆出租车搭乘第三个领域的朋友,第三辆,第四辆分别搭乘另外两个领域的朋友。这样需要的出租车数量最少。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int flag[5],i,sum=0;
memset(flag,0,sizeof(flag));
for(i=0;i<n;i++)
{
int p;
scanf("%d",&p);
flag[p]++;//分别标记人数为1,2,3,4的种数
}
sum+=flag[4];
int n2=min(flag[1],flag[3]);
sum+=n2;//把人数为1的领域和人数为3的领域凑在一块
flag[1]-=n2;
flag[3]-=n2;
sum+=flag[2]/2;//把人数为2的领域凑在一块
flag[2]%=2;
sum+=flag[3];//考虑如果人数为3的领域多的情况
if(flag[2]) //如果还有一类人数为2的领域的朋友没有上车
{
sum++;
flag[1]-=2;
}
if(flag[1]>0)
sum+=ceil(flag[1]*1.0/4);//向上取整函数ceil,头文件cmath
printf("%d\n",sum);
}
return 0;
}