Description
一支蚂蚁军队在长度为L厘米的横竿上走,每只蚂蚁的速度恒定,为1厘米/秒。当一只行走的蚂蚁到达模竿终点的时候,它就立即掉了下去;当两只蚂蚁相遇的时候,它们就调头,并开始往相反的方向走。我们知道蚂蚁在模竿上的原来的位置,但不知道蚂蚁行走的方向。请计算所有蚂蚁从模竿上掉下去的最早可能时间和最晚可能的时间。
Input
输入的第1行为样例数。每个样例首先给出2个整数,表示模竿的长度和蚂蚁的数量n。接下来的n个数表示蚂蚁在模竿上的位置(从左开始算起,n<1 000 000)。
Ouput
每个案例输出蚂蚁掉下去的最早时间和最晚时间。
Sample Input
2
10 3
2 6 7
214 7
11 12 7 13 176 23 191
Sample Output
4 8
38 207
思路
2 6 7
x 2 6 7(蚂蚁从左边走到终点)
l-x 8 4 3(蚂蚁从右边走到终点)
两只蚂蚁相遇可以等价于它们继续照各自原本的方向移动
要使所有蚂蚁从模竿上掉下去
最早可能时间是4(2 4 3)——求所有x和l-x中的最小中的最大
最晚可能时间是8(8 6 7)——求所有x和l-x中的最大中的最大
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int t = in.nextInt();
int l,n;
int maxt,mint,x;
while(t-->0) {
l = in.nextInt();
n = in.nextInt();
maxt = Integer.MIN_VALUE;
mint = Integer.MIN_VALUE;
for(int i=0;i<n;i++) {
x = in.nextInt();
maxt = Math.max(maxt, Math.max(x, l-x));
mint = Math.max(mint, Math.min(x, l-x));
}
System.out.println(mint+" "+maxt);
}
in.close();
}
}
另一种写法
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int T = in.nextInt();
while (T-- > 0) {
int l=in.nextInt();
int n=in.nextInt();
int a[]=new int[n];
int b[]=new int[n*2];
for(int i=0;i<n;i++){
a[i]=in.nextInt();
}
for(int i=0;i<n;i++){
b[i]=l-a[i];
}
int k=0;
for(int i=n;i<n*2;i++){
b[i]=b[k];
k++;
}
for(int i=0;i<n;i++){
b[i]=a[i];
}
Arrays.sort(b);
System.out.println(b[n-1]+" "+b[2*n-1]);
}
in.close();
}
}