车辆问题(贪心)

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

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

输入描述:

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

输出描述:

输出最少车数
示例1

输入

3
3 4 5

输出

3

备注:

n≤1e5
每个数小于等于5
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <cassert>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#pragma comment(linker, "/stck:1024000000,1024000000")
#define lowbit(x) (x&(-x))
#define max(x,y) (x>=y?x:y)
#define min(x,y) (x<=y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.1415926535897932384626433832
#define ios() ios::sync_with_stdio(true)
#define INF 0x3f3f3f3f
#define mem(a) ((a,0,sizeof(a)))
typedef long long ll;
int n,a[7],x,ans=0;
void check(int x,int y)
{
    int pos;
    pos=min((a[x]*x)/(5-y),a[y]);
    ans+=pos;
    a[x]-=pos*((5-y)/x);
    a[y]-=pos;
}
int main()
{
    scanf("%d",&n);
    memset(a,0,sizeof(a));
    for(int i=0;i<n;i++)
    {
        scanf("%d",&x);
        a[x]++;
    }
    ans+=a[5];
    a[5]-=ans;
    check(1,4);
    check(2,3);
    check(2,1);
    check(1,2);
    check(1,3);
    if(a[1] && a[2]) ans++,a[1]--,a[2]--;
    if(a[1] && a[3]) ans++,a[1]--,a[3]--;
    printf("%d\n",ans+(a[1]/5+(a[1]%5==0?0:1))+(a[2]/2+(a[2]%2==0?0:1))+a[3]+a[4]+a[5]);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/9026731.html