A25125. 热气球
填空题
容易
知识点
题目描述
热气球
题目描述:
某景区推出了一项热气球体验项目,目前有 n 组游客在等待乘坐热气球,且每组游客人数都不超过 4 人。
每个热气球的最大载客量为 4 人。
需要注意的是,同一组游客必须乘坐同一个热气球,而且只要人数不超过最大载客量,一个热气球可以容纳多组游客。
请你计算该景区最少需要准备多少个热气球,才能让 n 组游客同时乘坐上热气球。
例如:n = 7,7 组游客的人数分别是 3、2、1、2、1、4、2;要让所有游客同时乘坐上热气球,最少需要准备 4 个热气球,其中一种最优分组方案如下:
第 1 组(3 人)和第 3 组(1 人)乘坐第一个热气球;
第 2 组(2 人)和第 4 组(2 人)乘坐第二个热气球;
第 5 组(1 人)和第 7 组(2 人)乘坐第三个热气球;
第 6 组(4 人)乘坐第四个热气球。
输入描述:
第一行输入一个整数 n(1≤n≤105),表示游客的组数;
第二行输入 n 个整数(1≤整数≤4),表示每组游客的人数,整数之间以一个空格隔开。
输出描述:
输出一个整数,表示该景区最少需要准备的热气球的数量。
样例输入:
7
3 2 1 2 1 4 2样例输出:
4参考答案
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> groups(n);
for (int i = 0; i < n; ++i) {
cin >> groups[i];
}
sort(groups.begin(), groups.end(), greater<int>());
int left = 0, right = n - 1, balloons = 0;
while (left <= right) {
int capacity = 4 - groups[left];
left++;
// 尝试用大组剩余容量装载小组
while (left <= right && capacity >= groups[right]) {
capacity -= groups[right];
right--;
}
balloons++;
}
cout << balloons << endl;
return 0;
}答案解析
贪心算法
排序:将大组(3-4人)放在前面,小组(1-2人)放在后面
装载策略:
优先用大组的剩余容量装载小组
无法装载时开启新气球
样例:排序后 [4,3,2,2,2,1,1] → 4人组独立1球,3人组+1人组=1球,2人组+2人组=1球,剩余2人组+1人组=1球,共4球
上一题
下一题