CCF CSP考試題 2018-3 1、2題(跳一跳、碰撞)
第一題 跳一跳
試題編號: | 201803-1 |
試題名稱: | 跳一跳 |
時間限制: | 1.0s |
記憶體限制: | 256.0MB |
問題描述 | 問題描述 近來,跳一跳這款小遊戲風靡全國,受到不少玩家的喜愛。 輸入格式 輸入包含多個數字,用空格分隔,每個數字都是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單位長度每秒。 同時也可以證明兩個小球發生碰撞的位置一定是整數(但不一定是偶數)。輸入格式 輸入的第一行包含三個整數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)))
以上。