独木桥

独木桥

独木桥的长度为L,士兵们只能呆在坐标为整数的地方。所有士兵的速度都为1,但一个士兵某一时刻来到了坐标为0或L+1的位置,他就离开了独木桥。

每个士兵都有一个初始面对的方向,他们会以匀速朝着这个方向行走,中途不会自己改变方向。但是,如果两个士兵面对面相遇,他们无法彼此通过对方,于是就分别转身,继续行走。转身不需要任何的时间。

你想要知道最少需要多少时间就可能全部撤离独木桥,还需要知道你的部队最多需要多少时间才能全部撤离独木桥。
输入输出格式
输入格式

第一行:一个整数L,表示独木桥的长度。桥上的坐标为1…L

第二行:一个整数N,表示初始时留在桥上的士兵数目

第三行:有N个整数,分别表示每个士兵的初始坐标。

输出格式

只有一行,输出两个整数,分别表示部队撤离独木桥的最小时间和最大时间。两个整数由一个空格符分开。

输入输出样例
输入样例

4
2
1 3

输出样例

2 4

说明

初始时,没有两个士兵同在一个坐标。

数据范围
N<=L<=1000。

思路

这个题想出来难,实现起来很容易。
下面讲讲思路:
对于两个相向而行的士兵A,B
A→←B
这里写图片描述
最长时间:
这样,我们就可以把它看做是相遇后,他们都继续往前走,所需的
if(x>l/2)a1=max(x,a1);
else a1=max(l-x,a1);
最短时间就很显然了,就是把每一个数字到两端点的最短距离的最大值求出来。

#include
#include
using namespace std;
int i,j,m,n,l;
int a1,a2;
int x;
int r()
{
    char ch=getchar();
    int ans=0;
    while(ch<'0'||ch>'9')
    {
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        ans*=10;
        ans+=ch-'0';
        ch=getchar();
    }
    return ans;
}
int main()
{
    l=r();n=r();
    l++;
    for(i=1;i<=n;i++)
    {
    x=r();
    if(x>l/2)
    {a1=max(x,a1);
    a2=max(l-x,a2);}
    else
    {a1=max(l-x,a1);
    a2=max(x,a2);}
    }
    cout<" "<

你可能感兴趣的:(独木桥)