题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1266
题意:一条长为l cm的棍子上有n个蚂蚁,每秒行走1cm已知它们距离棍子左端点的距离,但是不知道朝向(往哪个方向爬),由于棍子太细,蚂蚁相遇后只能掉头返回,问所有蚂蚁掉下棍子时的最小时间和最大时间。
思路:看起来有速度,蚂蚁又要掉头,模拟很困难,其实并不用考虑这些。无论是最小时间和最大时间,都是由最后一个掉下去的蚂蚁决定的。所以我们分别找到距离棍子中点最近和最远的蚂蚁就可以了,最近往离端点近的方向走,最远的往另一个端点走。其他蚂蚁都给它让道。
#include<cstdio>
#include<queue>
#include<iostream>
#include<vector>
#include<map>
#include<cstring>
#include<string>
#include<set>
#include<stack>
#include<algorithm>
#define cle(a) memset(a,0,sizeof(a))
#define inf(a) memset(a,0x3f,sizeof(a))
#define ll long long
#define Rep(i,a,n) for(int i=a;i<=n;i++)
using namespace std;
const int INF = ( 2e9 ) + 2;
const int maxn = 5e4+10;
int p[maxn];
int main()
{
int n,l;
scanf("%d%d",&n,&l);
for(int i=0;i<n;i++)
scanf("%d",&p[i]);
int c=l/2;
int v1=INF,v2=-1;
for(int i=0;i<n;i++)
{
if(abs(p[i]-c)<v1)v1=abs(p[i]-c);
if(abs(p[i]-c)>v2)v2=abs(p[i]-c);
}
printf("%d %d\n",l/2-v1,l/2+v2);
}