题目名称:
一群蚂蚁在一根长L厘米的水平杆子上行走,每个蚂蚁的速度恒定为1厘米/秒。当一只行走的蚂蚁到达极点时,它马上就会从上面掉下来。当两只蚂蚁相遇时,它们会掉头朝相反的方向走。我们知道蚂蚁在杆子的最初位置,但是不知道蚂蚁行走的方向,最后计算所有蚂蚁从杆子坠落的最早和最迟的可能时间。
输入要求:
第一行包含一个整数,表示实验的次数。第二行有两个数,分别表示杆子的长度和蚂蚁的数量,第三行表示每个蚂蚁的座标。
输出要求:
对于每种输入情况,输出两个数字(用空格符分开),分别表示所有蚂蚁从杆子上掉下来的最早可能的时间(如果它们走路的方向选对了的话)和最晚可能的时间。
思路
由于蚂蚁的方向不知道,想要搜索每只蚂蚁的方向以及相遇情况,数据量太大,因为每只蚂蚁都是相同的,在蚂蚁相遇的时候,可以看做蚂蚁还是按照原来的方向行走,按照这个思路的话,那么掉下来的最早的时间就是所有蚂蚁距离两边的最小值里面的最大值,最晚时间就是距离两边的最远的最大值
代码如下
#include<stdio.h>
int max(int x,int y)
{
return x>y? x:y;
}
int min(int x,int y)
{
return x<y? x:y;
}
int main(){
int n;
int zuobiao[10000];//定义座标数组
scanf("%d",&n);//输入实验次数
int mintime=0;//定义最早时间
int maxtime=0;//定义最晚时间
while(n--){
int L,m;//定义杆子长度和蚂蚁数量
scanf("%d%d",&L,&m);
for(int i=0;i<m;i++)//输入每个蚂蚁的座标
scanf("%d",&zuobiao[i]);
for(int i=0;i<m;i++)
{
mintime=max(mintime,min(zuobiao[i],L-zuobiao[i]));//先求蚂蚁距离到两边的最小值,然后再求所有蚂蚁到两边距离最小值里面的最大值
maxtime=max(maxtime,max(zuobiao[i],L-zuobiao[i])); //先求蚂蚁距离到两边的最大值,然后再求所有蚂蚁到两边距离最大值里面的最大值
}
printf("%d %d\n",mintime,maxtime);
}
return 0;
}