第13次CCF认证第二题
- 大概意思就是一条线上 放有若干个小球,每个都以相同的速度1在朝着某个方向运动
- 碰撞后会反向
- 同一时刻最多只会有两个小球相撞 题上有证明我就不说了
- 问某一个时刻 所有球的位置
代码:
import java.util.Scanner;
public class second
{
public static void main(String[] args)
{
Scanner scanner=new Scanner(System.in);
String string=scanner.nextLine();
String sd[]=string.split(" ");
int sum[]=transfer(sd);
int ball_number=sum[0];
int linelength=sum[1];
int time=sum[2];
String strball=scanner.nextLine();
int balls[]=transfer(strball.split(" "));
//deal
int position[]=new int [ball_number];
int direction[]=new int [ball_number];
boolean bian[]=new boolean[ball_number];
for (int i = 0; i < bian.length; i++) {
bian[i]=false;
}
//方向
for (int i = 0; i < direction.length; i++) {
direction[i]=1;
}
//位置
for (int i = 0; i < position.length; i++) {
position[i]=balls[i];
}
int now=0;
while(now<time){
now++;
// 新的一轮可以变
for (int i = 0; i < bian.length; i++) {
bian[i]=false;
}
for (int i = 0; i < position.length; i++) {
//变相
if (position[i]==linelength||position[i]==0) {
// System.out.println("撞到墙了"+position[i]);
direction[i]=-direction[i];
}
//相撞变相
for (int j = 0; j < direction.length; j++) {
if (!bian[j]&&i!=j&&position[i]==position[j]){
// System.out.println("Main.main()"+position[i]+position[j]);
direction[i]=-direction[i];
direction[j]=-direction[j];
bian[j]=true;
bian[i]=true;
}
}
}
for (int i = 0; i < position.length; i++) {
position[i]+=direction[i];
}
}
out(position);
}
static void out (int a[]){
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
System.out.println();
}
static int[] transfer(String str[]){
int a[]=new int [str.length];
for (int i = 0; i < str.length; i++) {
a[i]=Integer.parseInt(str[i]);
}
return a;
}
}
思路代码中都给的差不多了,最后的结果也是正确的,希望能帮助到大家。
用一个while循环记录下每秒钟所有球的状态,然后一步一步得到t秒时所有球的状态。