SSLZYC 溜冰

题目大意:
一个国际溜冰比赛的赛道长L米。在起点选手的速度是1米/秒,但速度是可以改变的,在每一米的速度可以是前一米的速度加1、减1,或者等于前一米的速度。在滑行的过程中,选手会遇到N个转弯处,第i个转弯处位于距离出发点D[i]米处。为了安全,选手到达第i个转弯处的速度不能超过S[i]米/秒。选手到达终点时的速度没有最大限制。请你帮忙计算选手溜冰过程中最大的速度是多少?
下面的例子,距开始7米处限速为3、11米处限速为1、13米处限速为8,如下图:
这里写图片描述


思路:
没思路。。。。。。
这道题一看就是暴力模拟,分两种情况:
(1)前一个拐弯点一直上升到下一个拐弯点。
(2)前一个拐弯点先上升后下降到下一个拐弯点。
就可以利用n+2(起点和终点也算)个拐弯点确定答案。


代码:

#include <cstdio>
#include <iostream>
using namespace std;

int n,m,maxn,x,a[100001],b[100001];

void sorts(int l,int r)  //快排
{
    int i=l;
    int j=r;
    int z=b[(i+j)/2];
    do
    {
        while (b[i]<z) i++;
        while (b[j]>z) j--;
        if (i<=j)
        {
            swap(a[i],a[j]);
            swap(b[i],b[j]);
            i++;
            j--;
        } 
    }
    while(i<=j);
    if (i<r) sorts(i,r);
    if (j>l) sorts(l,j);
}

int main()
{
    freopen("skate.in","r",stdin);
    freopen("skate.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d",&b[i],&a[i]);
    }
    sorts(1,m); 
    a[0]=1; 
    b[0]=0; 
    a[m+1]=n+1; 
    b[m+1]=n;  //初始化
    for (int i=m;i>=1;i--) 
     a[i]=min(a[i],a[i+1]+b[i+1]-b[i]);  //判断:若上一个转弯点一直减速也无法低于下一个转弯点的速度就更改上一个转弯点的最大速度
    for (int i=1;i<=m+1;i++)
    {
        if (a[i]-a[i-1]>=b[i]-b[i-1]) 
        {
            if (a[i]>a[i-1]+b[i]-b[i-1]) a[i]=a[i-1]+b[i]-b[i-1];  //一直加速的情况
            maxn=max(maxn,a[i]);
        }
        else 
        {
            x=(int)(b[i]-b[i-1]+a[i]+a[i-1])/2;  //先加速后减速的情况
            maxn=max(maxn,x); 
        }
    }
    printf("%d\n",maxn);
    return 0;
}
原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313120.html