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 }