一群蚂蚁在一根长l厘米的水平杆上行走,每根杆的速度恒定为1厘米/秒。当一只蚂蚁走到杆的末端时,它立刻从杆上掉下来。当两只蚂蚁相遇时,它们会转身向相反的方向走。我们知道蚂蚁在柱子上的原始位置,不幸的是,我们不知道蚂蚁行走的方向。你的任务是计算所有蚂蚁从极点上掉下来所需要的最早和最晚的可能时间。
输入
输入的第一行包含一个整数,给出后面的事例数。每种情况下的数据以两个整数开始:极点的长度(单位:cm)和n,极点上的蚂蚁数量。这两个数字后面跟着n个整数,给出了每只蚂蚁在极点上的位置,即从极点左端开始测量的距离,没有特定的顺序。所有输入整数不大于1000000,并用空格分隔。
产量
对于每种输入情况,输出两个由单个空格分隔的数字。第一个数字是所有蚂蚁从极点上掉下来的最早时间(如果他们的行走方向选择得当),第二个数字是最晚的可能时间。
水题一枚,使用弹性碰撞的原理,全都掉下去的最小时间就是离两边最远的那个蚂蚁掉下去。最长时间是从这头走到那头用时最长的那个蚂蚁。思路就是这样,很简单。巧用max ,min 函数解决问题。
代码:
#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
const int maxn=1000000;
typedef long long ll;
using namespace std;
int a[maxn];
int l,n;
int main()
{
int t;
cin>>t;
while(t--)
{
int zuixiaomax=-1;
int zuidamax=-1;
cin>>l>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
int c=min(a[i],l-a[i]);
zuixiaomax=max(c,zuixiaomax);
}
cout<<zuixiaomax<<' ';
for(int i=1;i<=n;i++)
{
int c=max(a[i],l-a[i]);
zuidamax=max(zuidamax,c);
}
cout<<zuidamax<<endl;
}
return 0;
}