您的位置:首页 > 其它

nysit 309 BOBSLEDDING

2012-05-06 10:26 197 查看
这是一道模拟题,不过需要考虑的情况有很多。(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.T!=L) //加上终点位置{sled[n+1].T=L;sled[n+1].S=L+1;}else{sled[n+1].T=L;sled[n+1].S=sled.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;}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: