一、题目:
二、解题思路:
- 建立二维数组
a[n][3]
: a[n][0]
用于存储小球位置,a[n][1]
用于存储小球方向(1为正向,-1则相反)a[n][2]
用于存储小球的插入顺序(题目插入是无序的,我们希望小球位置按照从小到大排列,有了插入顺序就不怕排序后输出顺序被打乱)。
代码:
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(); //读入小球个数
int L = scanner.nextInt(); //读入线段长度
int t = scanner.nextInt(); //读入时间
int[][] a = new int[n][3]; for(int i=0;i<n;i++) { a[i][0] = scanner.nextInt(); //读入初始位置 a[i][1] = 1; //小球初始都为正向运动 a[i][2] = i+1; //存储插入顺序
} Arrays.sort(a,new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { return o1[0]-o2[0]; //按照从小到大排列 } }); for(int i=0;i<t;i++) { //循环t次 for(int j=0;j<n-1;j++) { //遍历1到n-1个小球,防止越界,看后面 a[j][0] +=a[j][1]; //每个小球移动一个单位 } if(a[n-1][0]==L) { //判断最后一个小球是否到右端点 a[n-1][1] = -1; //改变移动方向 } a[n-1][0] +=a[n-1][1]; //最后一个小球移动一个单位 for(int j =0;j<n-1;j++) { //遍历是否有小球相撞 if(a[j][0]==a[j+1][0]) { a[j][1] = -1; //调整两球方向为反方向 a[j+1][1] = 1; } if(a[n-2][0]==a[n-1][0]) { //判断倒数第1、2球是否相撞 a[n-2][1] = -1; a[n-1][1] = 1; } if(a[0][0]==0) { //判断第一个球是否达到左端点 a[0][1]=1; } }
}
Arrays.sort(a,new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { return o1[2]-o2[2]; //按照插入顺序排序 }
});
for(int i =0;i<n;i++) { System.out.print(a[i][0] + " ");
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
欢迎讨论~
文章来源: blog.csdn.net,作者:Kwang0077,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq_45762477/article/details/115052872