CCF 遊戲(Python實現 100分)

2021-08-29 00:24:57 字數 1941 閱讀 1550

目錄前言

一、問題描述

二、問題分析

三、程式說明

最近我在做ccf的題目,也打算把每道題的解題思路都寫到部落格上來,希望能幫助到也在做ccf題目的讀者們,希望你們通過本文能有所提示,幫助大家提公升程式設計能力。另外有個很好的想法就是,建議讀者們可以先看一下問題分析的部分,然後自己再整理一下思路,重新做一遍,最後再參考**,我想這樣會更有收穫。

問題描述

有n個小朋友圍成一圈玩遊戲,小朋友從1至n編號,2號小朋友坐在1號小朋友的順時針方向,3號小朋友坐在2號小朋友的順時針方向,……,1號小朋友坐在n號小朋友的順時針方向。

遊戲開始,從1號小朋友開始順時針報數,接下來每個小朋友的報數是上乙個小朋友報的數加1。若乙個小朋友報的數為k的倍數或其末位數(即數的個位)為k,則該小朋友被淘汰出局,不再參加以後的報數。當遊戲中只剩下乙個小朋友時,該小朋友獲勝。

例如,當n=5, k=2時:

1號小朋友報數1;

2號小朋友報數2淘汰;

3號小朋友報數3;

4號小朋友報數4淘汰;

5號小朋友報數5;

1號小朋友報數6淘汰;

3號小朋友報數7;

5號小朋友報數8淘汰;

3號小朋友獲勝。

給定n和k,請問最後獲勝的小朋友編號為多少?

輸入格式

輸入一行,包括兩個整數n和k,意義如題目所述。

輸出格式

輸出一行,包含乙個整數,表示獲勝的小朋友編號。

樣例輸入

5 2樣例輸出3

樣例輸入

7 3樣例輸出4

資料規模和約定

對於所有評測用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 9。

本題主要的解題思路如下:

①定義乙個列表存放每個人的存活狀態,1表示存活,0表示淘汰;並且用乙個變數 total 計算列表的和

②用乙個變數num模擬報數,遍歷n個元素,判斷存活狀態,存活的人才能報數,淘汰的人不可報數;同時判斷報的數值是否能否整除k,或者其個位數是否等於k,符合該條件則將該元素淘汰,替換為0

③建立外層迴圈,此迴圈判斷列表的和是否等於1,即只剩下最後乙個人時,迴圈結束

④找出最後存活的人的下標,輸出下標+1的值即為結果

n:輸入n個人,1表示存活,0表示淘汰

k:輸入淘汰數字,凡是k的倍數或其末位數(即數的個位)為k,則這個人被淘汰出局

a:儲存n個人的存活狀態

total:計算列表a的和

num:模擬報數,存活的人才能報數,淘汰的人不允許報數

index:找出最後存活的人的下標

python語言的程式如下(100分):

# 遊戲

s = input().split()

n = int(s[0])

k = int(s[1])

a = [1 for i in range(0,n)] # 有n個人,1表示存活,0表示淘汰

total = sum(a)

num = 0

while total > 1:

for i in range(0,len(a)):

if a[i] != 0:

num += 1

if (num % k == 0) or (num % 10 == k):

a[i] = 0

total = sum(a)

if total == 1:

break

index = a.index(1) # 找出1的下標

print(index+1)

ccf 201712 2 遊戲 Python實現

問題描述 試題編號 201712 2 試題名稱 遊戲時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 有n個小朋友圍成一圈玩遊戲,小朋友從1至n 編號,2號小朋友坐在1號小朋友的順時針方向,3號小朋友坐在2號小朋友的順時針方向,1號小朋友坐在n 號小朋友的順時針方向。遊戲開始,從1...

Python實現猜數字遊戲1 0版

功能 隨機生成乙個數字,最多有3次猜測機會,如果第一次沒有猜對,則從第二次猜測開始會提示玩家所猜的數字是大了還是小了。執行環境 python 3 import random 呼叫生成隨機數的模組random secret random.randint 1,10 呼叫random模組中生成整型隨機數的...

CCF201712 2 遊戲 (python語言)

試題編號 201712 2 試題名稱 遊戲時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 有n個小朋友圍成一圈玩遊戲,小朋友從1至n編號,2號小朋友坐在1號小朋友的順時針方向,3號小朋友坐在2號小朋友的順時針方向,1號小朋友坐在n號小朋友的順時針方向。遊戲開始,從1號小朋友開始順...