分析:
先对数据排序,再用贪心算法进行模拟,在前面可以接上的前提上,尽可能得使结尾更长。
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, m, mi = 0, ma = 0, res = 0;//mi为此时实际的末尾,mi+1为模拟的开头,ma为模拟时的最大结尾
pair <int, int> pie[100007];
scanf("%d%d", &n, &m);
for (int i = 0; i<m; i++)
{
scanf("%d%d", &pie[i].first, &pie[i].second);
}
sort(pie, pie + m);//按开始位置大小排序
for (int i = 0; i<m; i++)
{
if (pie[i].first>ma + 1)//此时接不上模拟的末尾,说明断了。
{
printf("-1");
break;
}
if (pie[i].first>mi + 1)//此时接不上实际的末尾,说明要把模拟实际接上。
{
res++;
mi = ma;
}
if (pie[i].first <= mi + 1)//正常的模拟,模拟出最大结尾。
{
ma = max(ma, pie[i].second);
if (ma >= n)
{
printf("%d", res + 1);//既然结尾达到了,直接接上并结束循环。
break;
}
}
}
return 0;
}