1. 程式人生 > >201803CCF第二題(碰撞的小球)Java

201803CCF第二題(碰撞的小球)Java

題目描述:數軸上有長度為L(L為偶數)的線段,左端點0,右端點L。n個小球開始都是向右,且都在偶數座標上,速度大小為1單位長度每秒。

當小球到達端點(0或L)時,立即反向,速度不變;當兩個小球相撞(在同一位置),立即反向,速度不變。

現在告訴你線段長度L,小球數量n,以及n個小球初始位置,請計算t秒之後各個小球的位置。

提示:同一時刻同一位置最多隻有兩個小球相撞,由於速度始終不變,所以碰撞時間也是整數,且在碰撞的位置也是整數(但不一定只能是偶數)。

輸入格式:第一行包括n(球的個數),L(線段長度),t(t秒之後),空格分隔。

                第二行包括n個整數a1,a2...an。分別代表球1到球n在初始時刻的位置。

輸出格式:包含n個整數,空格分隔,第i個整數代表球i在t時刻的位置。

樣例輸入:

3 10 5

4 6 8

樣例輸出:

7 9 9

樣例說明:圖片來源於點選開啟連結


測試樣例約定:給定的球的初始位置 0 < ai < L

------------------------------------------------------------------------------------------

本文用Java實現,如你習慣C/C++,思路差不多也是一樣的,程式碼如下:

import java.util.Scanner;
public class Main {
    public static void 
main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int L = sc.nextInt(); int t = sc.nextInt(); int timeCount = 0; //計時器 Ball [] ball = new Ball[n]; for (int i = 0; i < n; i++) ball[i] = new Ball(sc.nextInt(), 1);
while (++timeCount <= t) { for (int i = 0; i < n; i++) {//到達端點則反向 if(ball[i].direction == 1) { ball[i].position++; if(ball[i].position == L) ball[i].direction *= -1; //使球反向 } else { ball[i].position--; if(ball[i].position == 0) ball[i].direction *= -1; } } for (int i = 0; i < n - 1; i++) //判斷相撞 for (int j = i + 1; j < n; j++) if (ball[i].position.equals(ball[j].position)) { ball[i].direction *= -1; ball[j].direction *= -1; break; } } for(int i = 0; i < n; i ++) { //輸出結果 if (i == n - 1) System.out.print(ball[i].position); else System.out.print(ball[i].position + " "); } } } class Ball { public Integer position; //球的位置 public Integer direction; //球的方向,1為向右,-1為向左 public Ball(Integer position, Integer direction) { this.position = position; this.direction = direction; } }