这道题是一道贪心算法的题目,因为要求每个车子都需要满载,所以我们考虑每次尽可能地选取人数较多的小组。同时,我们可以使用桶来记录不同大小的小组的数量,便于计算最终所需的车辆数量。下面是对应的C++代码:
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<numeric>
#include<stack>
#include<string>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int cnt[5] = { 0 };
for (int i = 0,t=0; i < n; i++) {
cin >> t;
cnt[t]++;
}
int ans = cnt[4];
ans += cnt[3];
cnt[1] = max(cnt[1] - cnt[3], 0);
ans += cnt[2] / 2;
if (cnt[2] % 2 != 0) {
ans++;
cnt[1] = max(cnt[1] - 2 , 0);
}
ans += (cnt[1] + 3) / 4;
cout << ans << endl;
return 0;
}
代码中,我们使用一个数组cnt
来记录不同大小的小组的数量,然后根据题目所述的贪心策略来计算所需的车辆数量。特别地,当小组的大小为2时,如果有偶数个小组,则可以将它们分别安排在不同的车子里,否则需要安排其中的一个小组和一个大小为1的小组一起乘车。同时,对于小组大小为1的情况,如果还有未被安排的小组,则可以将它们安排在同一辆车子里,这样可以使所需的车辆数量最小化。
这道题思路很简单,但这个代码很妙。
学到了学到了!