NYOJ309(数论)

题意:长L米,有N个弯,弯 i 位置为 T_i ,速度不能超过 S_i 米。前进一米速度可以增加 1,保持不变或减少 1m/s 。求此路程中最大的速度。

解题思路:定义 a[], b[], c[] 三个数组,数组a[]从开始记录在每个位置中速度的最大值,数组 b[] 从结尾倒着记录速度的最大值。而数组 c[] 记录同一位置i 的 a[i] 和 b[i] 的最小值。然后求数组 c[] 中的最大值即为所求。

View Code
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 #define MAX 1005
 6 int a[MAX],b[MAX],c[MAX],t[MAX];
 7 
 8 int main()
 9 {
10     int l,n,i,speed,pos;
11     while(cin>>l>>n)
12     {
13         memset(t,0,sizeof(t));
14         while(n--)
15         {
16             cin>>pos>>speed;
17             t[pos]=speed;
18         }
19         a[0]=1;
20         for(i=1;i<=l;i++)
21             if(!t[i]||t[i]>a[i-1]) a[i]=a[i-1]+1;
22             else a[i]=t[i];
23         b[l]=MAX;
24         for(i=l-1;i>=0;i--)
25             if(!t[i]||t[i]>b[i+1]) b[i]=b[i+1]+1;
26             else b[i]=t[i];
27         int max=0;
28         for(i=0;i<=l;i++)
29         {
30             if(a[i]<b[i]) c[i]=a[i];
31             else c[i]=b[i];
32             if(c[i]>max) max=c[i];
33         }
34         cout<<max<<endl;    
35     }
36     return 0;
37 }

 

posted @ 2012-03-10 09:01  笑巧  阅读(167)  评论(0编辑  收藏  举报