传送门:
https://www.nowcoder.com/acm/contest/112/B
有n个队伍,每个队伍的人数小于等于5,每辆车最多坐5个人,要求一个队伍的人都在一辆车上,求最少的车数
贪心思想:
4 要么自己一车 ,要么和1一车
3要么和2一车 要么和1一车 ,要么自己一车
剩下的就只有2和 1了
(1 ,1)可以代替2,反之不能。即优先把大的安排了
思路:
1. 5的凑够一车走
2. 4的只能和1凑 也就是匹配的1最多为a[4]个
3. 3先和2凑一车,然后剩下的3只能与1凑一车,匹配的1最多有2*a[3]个
接下来就只剩 2 和1 了
4. 首先考虑(2 ,2,1)的情况 (2 ,2)共有d组 那么匹配的1最多有d个, 接下来只有一个车里只有一个2的情况(此时2要么为0个要么只有1个),2最多和3个1配对 ,则匹配的1最多有3*a[3]个
剩下的就只有1了。
5.1自行挤一车
注意:
代码:
#include<stdio.h> #include<cstring> #include<string> #include<algorithm> #include<iostream> #include<math.h> using namespace std; const int maxn=150; const int INF=0x3f3f3f3f; typedef long long ll; int a[10]; int main() { int n,ans; while(~scanf("%d",&n)) { ans=0; for(int i=0; i<=5; i++) a[i]=0; int val; while(n--) { scanf("%d",&val); ++a[val]; } int d; ans=a[5]; a[5]=0; if(a[1]>a[4]) a[1]-=a[4]; else a[1]=0; ans+=a[4];//4用完了 a[4]=0; d=min(a[2],a[3]);// 2 3 ans+=d; a[2]-=d; a[3]-=d; ans+=a[3];//3 1 1 or 3 1 or 3 if(a[1]>2*a[3]) a[1]-=2*a[3]; else a[1]=0; //只剩下a[1] 和a[2] d=a[2]/2;//2 2 1 or 2 2 if(a[1]>d) a[1]-=d; else a[1]=0; ans+=d; a[2]-=2*d; if(a[1]>3*a[2]) a[1]-=3*a[2]; else a[1]=0; ans+=a[2]; a[2]=0; d=a[1]/5; ans+=d; if(a[1]>5*d) ans++; printf("%d\n",ans); } }