题解 | #华华听月月唱歌#
华华听月月唱歌
https://ac.nowcoder.com/acm/problem/23036
贪心策略是每次向后寻找能跳到的区间里面右端最远的那一个,如果挑不到或者最后不足N那么就证明无法满足。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
struct Node{
int l;
int r;
} node[MAXN];
bool comp(Node n1, Node n2) {
if (n1.l==n2.l) return n1.r>n2.r;
return n1.l<n2.l;
}
int main() {
int N, M;
scanf("%d%d", &N, &M);
for (int i=0;i<M;i++) {
scanf("%d", &node[i].l);
scanf("%d", &node[i].r);
}
sort(node, node+M,comp);
if (node[0].l!=1) {
printf("-1");
return 0;
}
int ans = 1, maxr = node[0].r, temp = node[0].r;
for (int i=1;i<M&&maxr<N;) {
while (node[i].l<=maxr+1&&i<M) {
temp = max(temp, node[i].r);
i++;
}
if (temp==maxr) {
break;
}
ans++;
maxr = temp;
}
if (maxr>=N) {
printf("%d", ans);
} else {
printf("-1");
}
return 0;
}

查看6道真题和解析