1. 程式人生 > >CCF CSP考試題 2018-3 1、2題(跳一跳、碰撞)

CCF CSP考試題 2018-3 1、2題(跳一跳、碰撞)

第一題 跳一跳

試題編號:201803-1
試題名稱:跳一跳
時間限制:1.0s
記憶體限制:256.0MB
問題描述

問題描述

       近來,跳一跳這款小遊戲風靡全國,受到不少玩家的喜愛。
  簡化後的跳一跳規則如下:玩家每次從當前方塊跳到下一個方塊,如果沒有跳到下一個方塊上則遊戲結束。
  如果跳到了方塊上,但沒有跳到方塊的中心則獲得1分;跳到方塊中心時,若上一次的得分為1分或這是本局遊戲的第一次跳躍則此次得分為2分,否則此次得分比上一次得分多兩分(即連續跳到方塊中心時,總得分將+2,+4,+6,+8...)。   
  現在給出一個人跳一跳的全過程,請你求出他本局遊戲的得分(按照題目描述的規則)。
  

輸入格式   

  輸入包含多個數字,用空格分隔,每個數字都是1,2,0之一,1表示此次跳躍跳到了方塊上但是沒有跳到中心,2表示此次跳躍跳到了方塊上並且跳到了方塊中心,0表示此次跳躍沒有跳到方塊上(此時遊戲結束)。   

輸出格式

  輸出一個整數,為本局遊戲的得分(在本題的規則下)。   

樣例輸入

1 1 2 2 2 1 1 2 2 0

樣例輸出資料規模和約定   

  對於所有評測用例,輸入的數字不超過30個,保證0正好出現一次且為最後一個數字。

解題思路

本題主要是將連續跳方塊中心的得分做一個增加處理以及在相鄰的兩跳中一個跳至方塊中心另外一跳不在方塊中心的得分的處理。
總結就是:如題所述的連續跳方塊中心的時候每次得分都會比上一次多得兩分;加入上一跳是方塊中心而這次不是的話則要恢復不在方塊中心的得分,反之則變成初次跳到方塊中心的分數。

# 跳一跳 
ls = input().split()  # 或者寫成 ls = list(map(int, input().split())),之後的程式碼也跟著改
ay = []  # 元素陣列
sm = 0  # 分數總和
tmp = 0  # 上一輪分數以及本輪的分數
for i in range(len(ls)):
    ay.append(int(ls[i]))
for i in ay:
    if i == 1:  #不在方塊中心的分數
        tmp = 1
        sm += tmp
    elif i == 2:
        if tmp >=
2: # 在方塊中心且不是上一次也是在方塊中心 tmp += 2 sm += tmp else: # 在方塊中心且上一次不是在方塊中心 tmp = 2 sm += tmp elif i == 0: break print(sm)

第二題 碰撞的小球

試題編號:201803-2
試題名稱:碰撞的小球
時間限制:1.0s
記憶體限制:256.0MB
問題描述:

問題描述

       數軸上有一條長度為L(L為偶數)的線段,左端點在原點,右端點在座標L處。有n個不計體積的小球線上段上,開始時所有的小球都處在偶數座標上,速度方向向右,速度大小為1單位長度每秒。
  當小球到達線段的端點(左端點或右端點)的時候,會立即向相反的方向移動,速度大小仍然為原來大小。
  當兩個小球撞到一起的時候,兩個小球會分別向與自己原來移動的方向相反的方向,以原來的速度大小繼續移動。
  現在,告訴你線段的長度L,小球數量n,以及n個小球的初始位置,請你計算t秒之後,各個小球的位置。

提示  因為所有小球的初始位置都為偶數,而且線段的長度為偶數,可以證明,不會有三個小球同時相撞,小球到達線段端點以及小球之間的碰撞時刻均為整數。
  同時也可以證明兩個小球發生碰撞的位置一定是整數(但不一定是偶數)。輸入格式  輸入的第一行包含三個整數n, L, t,用空格分隔,分別表示小球的個數、線段長度和你需要計算t秒之後小球的位置。
  第二行包含n個整數a1, a2, …, an,用空格分隔,表示初始時刻n個小球的位置。輸出格式  輸出一行包含n個整數,用空格分隔,第i個整數代表初始時刻位於ai的小球,在t秒之後的位置。樣例輸入3 10 5
4 6 8樣例輸出7 9 9樣例說明  初始時,三個小球的位置分別為4, 6, 8。

  一秒後,三個小球的位置分別為5, 7, 9。

  兩秒後,第三個小球碰到牆壁,速度反向,三個小球位置分別為6, 8, 10。

  三秒後,第二個小球與第三個小球在位置9發生碰撞,速度反向(注意碰撞位置不一定為偶數),三個小球位置分別為7, 9, 9。

  四秒後,第一個小球與第二個小球在位置8發生碰撞,速度反向,第三個小球碰到牆壁,速度反向,三個小球位置分別為8, 8, 10。

  五秒後,三個小球的位置分別為7, 9, 9。
樣例輸入10 22 30
14 12 16 6 10 2 8 20 18 4樣例輸出6 6 8 2 4 0 4 12 10 2資料規模和約定  對於所有評測用例,1 ≤ n ≤ 100,1 ≤ t ≤ 100,2 ≤ L ≤ 1000,0 < ai < L。L為偶數。
  保證所有小球的初始位置互不相同且均為偶數。

解題思路

構建小球運動的模型,做好每一時刻小球碰撞的判斷以及碰撞之後方向的處理,就ok了。可以建立一個等於小球數量的陣列,儲存沒個小球上一秒的方向以及記錄現在的方向,從而實現小球碰撞模型。
程式碼參考:CSDN部落格

# 小球碰撞問題  關鍵是怎麼模擬出小球的這個模型,還是需要在構建模擬模型上學習下
n, l, t = input().split()
n = int(n)
l = int(l)
t = int(t)
ay = []
ls = input().split()
for i in range(len(ls)):
    ay.append(int(ls[i]))
dr = [1 for i in range(n)]
for i in range(t):
    for j in range(n):
        if ay[j] == 0 or ay[j] == l:
            dr[j] = -dr[j]
    for k in range(n):
        for o in range(k+1, n, 1):
            if ay[o] == ay[k]:
                dr[o] = -dr[o]
                dr[k] = -dr[k]
    for m in range(n):
        ay[m] = ay[m] + dr[m]
print(" ".join(str(p) for p in (ay)))

以上。