作者:潜水的飞机537 | 来源:互联网 | 2024-12-08 16:49
问题背景
题目设定了一组奶牛(总数不超过2500头)计划进行户外活动,即享受日光浴。然而,由于每头奶牛对阳光的敏感程度不同,它们各自能接受的阳光强度范围也有所不同。为了保护奶牛免受过度暴晒或无法感受到阳光的困扰,牧场主决定使用防晒霜来调节每头奶牛所接触的阳光强度。市面上提供多种防晒霜,每种都有固定的阳光强度值以及可用的数量限制。
解决方案
本题的核心在于利用贪心算法有效分配防晒霜,以达到尽可能多的奶牛能够安全地享受日光浴的目的。具体步骤如下:
- 首先,根据奶牛可接受的最低阳光强度对所有奶牛进行排序。
- 接着,同样基于最低阳光强度对所有可用的防晒霜进行排序。
- 通过优先队列(或堆)来动态管理防晒霜的分配情况,确保每次选择最适合当前奶牛的防晒霜,同时更新剩余可用的防晒霜列表。
该方法的有效性在于始终优先考虑当前最迫切需要防晒霜的奶牛,从而保证整体上更多的奶牛能够享受到合适的阳光强度。
代码实现
#include
#include
#include
#include
#define ll long long
#define N 50005
using namespace std;
int n, num;
struct COW {
int l, r, id, ans;
bool operator <(const COW x) const {
return l }
} cow[N];
int ans[N];
priority_queue> s;
int main() {
// freopen("testdata.in", "r", stdin);
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
cow[i].id = i;
scanf("%d%d", &cow[i].l, &cow[i].r);
}
sort(cow + 1, cow + 1 + n);
for (int i = 1; i <= n; i++) {
int total = s.size();
if (total && -s.top().first cow[i].ans = s.top().second;
s.pop();
s.push(make_pair(-cow[i].r, cow[i].ans));
continue;
}
cow[i].ans = ++num;
s.push(make_pair(-cow[i].r, num));
}
printf("%d\n", s.size());
for (int i = 1; i <= n; i++) ans[cow[i].id] = cow[i].ans;
for (int i = 1; i <= n; i++) printf("%d\n", ans[i]);
return 0;
}