车辆安排
时间限制: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;
}