车辆安排

时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K

链接:​​https://www.nowcoder.com/acm/contest/112/B​​​

来源:牛客网

题目描述

有n个队伍,每个队伍的人数小于等于5,每辆车最多坐5个人,要求一个队伍的人都在一辆车上,求最少的车数

输入描述:

第一行n
第二行n个数,表示每个队伍的人数


输出描述:


输出最少车数


示例1


输入


3
3 4 5


输出


3


备注:

n≤1e5
每个数小于等于5

解题报告

题意:这道题相当于,给你体积为5的包,让你去装n个体积不超过5的物品(不可分割),求所用包的最少数量。

解题思路:先把体积为5的装上,然后体积为4的和体积为1的、体积为3的和体积为2的可以一块装,两个体积为1的和一个体积为3的、三个体积为1的和一个体积为2的、两个体积为2的和一个体积为1的也可以放在一起装。其中,如果体积为4的多余体积为1的,显然剩余的体积为4的就是一个装一个。具体的见代码:

#include <stdio.h>
#include <string.h>
int main()
{
int n, m, ans, s[10];
while (~scanf("%d", &n))
{
ans = 0;
memset(s, 0, sizeof(s));
for (int i = 0; i < n; i++)
{
scanf("%d", &m);
s[m]++;
}
ans += s[5];
s[5] = 0;
while (s[4])
{
ans++;
s[4]--;
s[1]--;
if (s[1] < 0)
s[1] = 0;
}
while (s[2] && s[3])
{
s[3]--;
s[2]--;
ans++;
}
while (s[2])
{
ans++;
if (s[2] == 1)
{
s[2]--;
s[1] -= 3;
if (s[1] < 0)
s[1] = 0;
}
else
{
s[1]--;
s[2] -= 2;
if (s[1] < 0)
s[1] = 0;
}
}
while (s[3])
{
ans++;
s[3]--;
s[1] -= 2;
if (s[1] < 0)
s[1] = 0;
}
if (s[1])
ans += (s[1] + 4 ) / 5;
printf("%d\n", ans);
}
return 0;
}