牛客网 B车辆安排

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

题目描述

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

输入描述:

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

输出描述:

输出最少车数    
 
  
示例1

输入

3
3 4 5

输出

3

备注:

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


#include<bits/stdc++.h>
using namespace std;
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])
        {
            ans++;
            s[3]--;
            s[2]--;
        }
        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;
}
dalao代码
#include<bits/stdc++.h>
using namespace std;
int num;
int b[10];
int n;
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&num);
        b[num]++;
        }
        n-=b[5];
        int ans=0;
        while(n){
            ans++;
             int k=5;
            for(int i=4;i>=1;i--){
                while(b[i]&&k>=i){
                    b[i]--;
                    k-=i;
                    n--;
                }
            }
        }
        printf("%d",ans+b[5]);
        return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41156122/article/details/80287670