nysit 309 BOBSLEDDING

  这是一道模拟题,不过需要考虑的情况有很多。

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












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值