题目链接:https://www.acwing.com/problem/content/907/
解题思路:
首先对每个区间的左端点排序从小到大排序,若是左端点相等,就对区间的右端点从小到大排序。
我们选的第一个点是左端点最右边的左端点,这个点,然后不断地往前去找点,当前面的一个区间的右端点 < 当前所记录的点后,就更新我们记录的点的位置即再放一个石头在这个地方,直到找到第一个点为止。
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 5;
struct Node {
int l, r;
}node[maxn];
inline bool cmp(Node a, Node b) {
if(a.l == b.l) a.r < b.r;
return a.l < b.l;
}
int main(void) {
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i ++)
scanf("%d%d", &node[i].l, &node[i].r);
sort(node + 1, node + 1 + n, cmp);
int ans = 1, tmp = node[n].l;
for(int i = n - 1; i >= 1; i --) {
if(node[i].r >= tmp) continue;
else {
ans ++;
tmp = node[i].l;
}
}
printf("%d\n", ans);
return 0;
}
总结:感觉贪心问题可以去尝试不同的思路,一般是排序。
这道题的话,刚开始我的想法是直接对每一个点进行累加,后来发现,会超时,就想到可以不可以排序,结果可以。