题意
http://codeforces.com/problemset/problem/45/D
给定
n
n
n个活动可能发生的区间
[
l
i
,
r
i
]
[l_i, r_i]
[li,ri],求这
n
n
n个活动可能发生的各个时刻(都是整数,至少存在一组解)
n
≤
100
,
l
i
,
r
i
≤
1
0
7
n \le 100, l_i, r_i \le 10^7
n≤100,li,ri≤107
算法:模拟、贪心
乍一看像“活动选择问题”,不过不是选择兼容活动的最大集。但是贪心策略实际也差不多:按活动的结束时间升序排序,排序时需要记录下原始的序号
对于排序后的活动序列中的某个序列
i
i
i,从它的开始时刻开始检查是否可用,可用的就选择该时刻,并做好时刻占用标记即可。排序复杂度
O
(
n
log
n
)
O(n\log n)
O(nlogn),扫描复杂度
O
(
n
)
O(n)
O(n)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 100+2, maxm = 1e7+5;
struct node
{
int bg, ed, id;
} a[maxn];
int n, ans[maxn];
bool vis[maxm];
bool cmp(node a, node b)
{
return a.ed < b.ed;
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d %d", &a[i].bg, &a[i].ed);
a[i].id = i;
}
sort(a, a+n, cmp);
for (int i = 0; i < n; i++)
{
int y = a[i].bg;
while (vis[y]) y++;
vis[y] = true;
ans[a[i].id] = y;
}
for (int i = 0; i < n; i++)
printf("%d ", ans[i]);
return 0;
}