NYOJ 309

View Code
 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 }

 

posted @ 2012-05-03 19:22  知行执行  阅读(170)  评论(0编辑  收藏  举报