这是一道模拟题,不过需要考虑的情况有很多。
(1)给的测试用例是按点的顺利从小到大给的,但不一定是有顺序的,所以首先要排序一下!
(2)因为题意上说,起始点和终点是包含的,所以也要考虑,尤其是终点的速度。
(3)题上给的限制速度需要修改,如 7位置限制速度为5,在8位置限制速度为1,就要把7位置的限制速度改为2。我们容易想到的是假如7位置的限制速度是9,需要把它改为8,而不容易想到前一种情况。
我的思路是,求给出的拐点之间的最大速度 vm和 maxn 进行比较,maxn的初值为0;
if(max < vm)
maxn=vm;
还有另一种思路是,把 L 长度上的每一点的速度计算出来,找它的最大值!
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<stdlib.h>
#include<string.h>
struct SLED{
int T;
int S;
};
SLED sled[505];
int cmp(const void *a,const void *b)
{
return (*(SLED *)a).T>(*(SLED *)b).T?1:-1;
}
int main()
{
int L,n;
sled[0].T=0; //加上起始位置
sled[0].S=1;
while(scanf("%d%d",&L,&n)!=EOF)
{
int i;
for(i=1;i<=n;i++)
scanf("%d%d",&sled[i].T,&sled[i].S);
qsort(sled,n+1,sizeof(SLED),cmp); //位置从小到大排一下序
if(sled[n].T!=L) //加上终点位置
{
sled[n+1].T=L;
sled[n+1].S=L+1;
}
else
{
sled[n+1].T=L;
sled[n+1].S=sled[n].S;
}
//从后往前,把限制速度改一下
for(i=n+1;i>1;i--)
{
int T1=sled[i].T-sled[i-1].T;
int S1=sled[i-1].S-sled[i].S;
if( S1>0 && S1>T1)
sled[i-1].S=sled[i].S+T1;
}
//计算最大速度
int maxn=1;
for(i=1;i<=n+1;i++)
{
int ms=sled[i-1].S+sled[i].T-sled[i-1].T; //公式 v=v'+a*t;
if(sled[i].S>=ms)
{
sled[i].S=ms;
if(maxn<ms)
maxn=ms;
}
else
{
int vm=sled[i].S+(abs(ms-sled[i].S)/2);
if(maxn<vm)
maxn=vm;
}
}
printf("%d\n",maxn);
}
return 0;
}