Wannafly挑战赛15 B 车辆安排 模拟

题目描述 

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

输入描述:

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

输出描述:

输出最少车数
示例1

输入

3
3 4 5

输出

3

备注:

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

题解:

凑5 : 5, 1 4, 2 3, 1 2 2,1 1 3,1 1 1 2, 1 1 1 1 1

凑4:  4,1 3, 2 2, 1 1 2, 1 1 1 1

凑3:  3, 1 2, 1 1 1

凑2:  2,1 1

凑1: 1


代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
typedef long long ll;
ll arr[maxn];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        ll ans = 0;
        memset(arr,0,sizeof(arr));
        for(int i=0,x;i<n;i++) scanf("%d",&x),arr[x]++;
        int temp = min(arr[1],arr[4]);
        arr[1] -= temp;arr[4] -= temp;
        arr[5] += temp;

        temp = min(arr[2],arr[3]);
        arr[2] -= temp;arr[3] -= temp;
        arr[5] += temp;

        temp = min(arr[1],arr[2]/2);
        arr[1] -= temp;arr[2] -= temp*2;
        arr[5] += temp;

        temp = min(arr[1]/2,arr[3]);
        arr[1] -= temp*2;arr[3] -= temp;
        arr[5] += temp;

        temp = min(arr[1]/3,arr[2]);
        arr[1] -= temp*3;arr[2] -= temp;
        arr[5] += temp;

        temp = arr[1]/5;
        arr[1] -= temp*5;
        arr[5] += temp;

        temp = min(arr[1],arr[3]);
        arr[4] += temp;
        arr[1] -= temp;
        arr[3] -= temp;

        temp = arr[2] / 2;
        arr[4] += temp;
        arr[2] -= temp*2;

        temp = arr[1] / 4;
        arr[1] -= temp*4;
        arr[4] += temp;

        temp = min(arr[1],arr[2]);
        arr[3] += temp;
        arr[1] -= temp;
        arr[2] -= temp;

        temp = arr[1] / 3;
        arr[3] += temp;
        arr[1] -= temp*3;

        temp = arr[1] / 2;
        arr[2] += temp;
        arr[1] -= temp*2;

        for(int i=1;i<=5;i++) ans+= arr[i];
        printf("%lld\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_38013346/article/details/80290116