车辆安排

链接:https://www.nowcoder.com/acm/contest/112/B
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

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

输入描述:

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

输出描述:

输出最少车数
示例1

输入

3
3 4 5

输出

3

备注:

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

尽量把5填满,剩下的另外考虑-

#include<stdio.h>
#define N 10
int a[N];
int main()
{
    int n,i,number,ans=0,t;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&number);
        a[number]++;
    }
    ans+=a[5];
     
    if(a[1]>a[4])
        t=a[4];
    else
        t=a[1];
    ans+=t;
     
    a[1]-=t;
    a[4]-=t;
     
    if(a[2]>a[3])
        t=a[3];
    else
        t=a[2];
    ans+=t;
    a[2]-=t;
    a[3]-=t;
     
    if(a[1]&&a[3])
    {
        ans+=a[3];
        a[1]-=a[3]*2;
        if(a[1]>0)
        {
            a[1]=(a[1]+4)/5;
            ans+=a[1];
        }
        a[1]=0;
        a[3]=0;
    }
     
    else if(a[1]&&a[2])
    {
        if(a[2]%2==0)
        {
            a[2]=a[2]/2;
            a[1]-=a[2];
            ans+=a[2];
            if(a[1]>0)
            {
                a[1]=(a[1]+4)/5;
                ans+=a[1];
            }
        }
        else{
            a[2]=a[2]/2+1;
            a[1]-=2;
            a[1]-=a[2];
            ans+=a[2];
            if(a[1]>0)
            {
                a[1]=(a[1]+4)/5;
                ans+=a[1];
            }
        }
         
    }
     
    else if(a[2]&&a[4])
    {
        ans+=a[4];
        a[2]=(a[2]+1)/2;
        ans+=a[2];
    }
     
    else if(a[3]&&a[4])
    {
        ans+=a[3]+a[4];
    }
     
    else if(a[1])
    {
        a[1]=(a[1]+4)/5;
            ans+=a[1];
    }
    else if(a[2])
    {
        a[2]=(a[2]+1)/2;
        ans+=a[2];
    }
    else if(a[3])
    {
        ans+=a[3];
    }
    else if(a[4])
    {
        ans+=a[4];
    }
    printf("%d
",ans);
}

原文地址:https://www.cnblogs.com/zyq1758043090/p/10003046.html