题目描述
有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; }