1 /*
2 题意:在一个滑雪道上没个单位长度可以减速 1 ,也可
3 增速 1 ,也可保持不变,滑雪道中有一些corner,在此处要限制速度,
4 问在整个滑雪过程中可以获得最大速度。
5 思路: 1.先求出每点可以允许的最大速度
6 2.然后从起点起计算每点能达到的速度
7 3.求最大速度
8 */
9 #include<iostream>
10 #include<cstdio>
11 #include<algorithm>
12 #include<cstdlib>
13 using namespace std;
14
15 const int size=1010;
16
17 struct node
18 {
19 short x,y;
20 }limit[size/2];
21
22 short spd[size];
23
24 bool cmp(node p,node q)
25 {
26 if(p.x!=q.x)return p.x<q.x;
27 else return p.y>q.y;
28 }
29
30 int main()
31 {
32 int N,L,i,j;
33 while(EOF != scanf("%d%d",&L,&N))
34 {
35 for(i=0;i<N;++i)
36 scanf("%d%d",&limit[i].x,&limit[i].y);
37
38 for(i=0;i<=L;++i)//初始允许的最大速度
39 spd[i]=i+1;
40
41 sort(limit,limit+N,cmp);//防止一点多个限制,把限制小的放在后面
42
43 for(i=0;i<N;++i)
44 {
45 int a=limit[i].x;
46 int b=limit[i].y;
47 if(spd[a]>b)spd[a]=b;//设置corner 处的速度
48 for(j=a-1;j>=0&&spd[j]>spd[j+1]+1;--j)//更新corner以前的速度 ,使其符合拐点的条件要求
49 spd[j]=spd[j+1]+1; //可能的新值和旧值取最小值
50 }
51
52 for(i=limit[N-1].x+1;i<=L;++i)//更新最后一个拐点以后的值
53 spd[i]=spd[i-1]+1;
54
55 int max=spd[0];
56 for(i=1;i<=L;++i)
57 {
58 if(spd[i]>spd[i-1]+1)spd[i]=spd[i-1]+1;
59 if(max<spd[i])max=spd[i];
60 }
61 printf("%d\n",max);
62
63 }
64 return 0;
65 }