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