1.前置知识
2.题意
有编号1-n的n个点与m条线段。其中第i条线段能容纳v[i]个编号在l[i]~r[i]之中的点,求最多有几个点能被放在线上。
3.思路
依次讨论每个点。每次将不合要求的线删去,符合要求的线加入。最后将这个点放入l最小的线段(满足贪心)即可。
4.时间复杂度
5.代码
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
int n, m;
struct node
{
int l, r, v;
};
node line[10005];
bool cmp(node a, node b)
{
return a.l < b.l;
}
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > pq;
int main()
{
while (scanf("%d %d", &n, &m) != EOF)
{
while (!pq.empty())pq.pop();
int ans = 0;
for (int i = 1; i <= m; i++)scanf("%d %d %d", &line[i].l, &line[i].r, &line[i].v);
sort(line + 1, line + 1 + m, cmp);
for (int i = 1, tot = 1; i <= n; i++)
{
while (!pq.empty() && pq.top().first < i)pq.pop();
while (line[tot].l == i)
{
pq.push(make_pair(line[tot].r, line[tot].v));
tot++;
}
if (pq.empty())continue;
ans++;
pair<int, int> x = pq.top();
pq.pop();
x.second--;
if (x.second >= 1)pq.push(x);
}
printf("%d\n", ans);
}
return 0;
} 


京公网安备 11010502036488号