有n个队伍,每个队伍的人数小于等于5,每辆车最多坐5个人,要求一个队伍的人都在一辆车上,求最少的车数
输入描述:
第一行n 第二行n个数,表示每个队伍的人数
输出描述:
输出最少车数
示例1
输入
3 3 4 5
输出
3
备注:
n≤1e5
每个数小于等于5
/*
能够组成5的有
1 1 1 2
1 2 2
1 1 3
1 4
2 3
5
本来我的思路是先组合 1 4,2 3.
再拿剩下的数去拼凑 1 2 2,1 1 3,1 1 1 2.
可是1 2 2与1 1 1 2不知道该优先拼凑谁,后来看了别人的,才有了下列代码
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1e5+5;
int a[maxn];
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
for(int i=0; i<n; i++)
{
int x;
scanf("%d",&x);
a[x]++;
}
int sum=0;
while(n)
{
sum++;
int now=5;
for(int i=5; i>=1; i--)
{
while(a[i]&&now>=i)
{
a[i]--;
n--;
now-=i;
}
}
}
printf("%d\n",sum);
}
return 0;
}