ccf报数游戏java,CCF 201712-2 游戏 《超越自我,攀登顶峰》
試題編號: 201712-2
試題名稱: 游戲
時間限制: 1.0s
內存限制: 256.0MB
問題描述
有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。
#include
#define _for(i, a, b) for (int i = a; i < b; i++)
using namespace std;
int main()
{
int n, k; //小朋友的個數n,數k
cin >> n >> k;
int play[1001] = {0};
int count = 0;
int survive = n;
while (survive > 1) //當有游戲還有兩人進行時,游戲繼續
{
_for(i, 0, n) //游戲在5個人中循環
{
count++; //計數器
if (count % k == 0 || count % 10 == k) //判斷是否為k的倍數或末尾含k
{
while (play[i] == -1) i = (i + 1) % n; //按順序找到下一個還未出局者,令他出局
play[i] = -1;
survive--;
if (survive == 1) break;
}
else if (play[i] == -1) //雖然不含k的倍數或末尾含k,但是該參與者在此前已經出局
while (play[i] == -1) i = (i + 1) % n; //按順序找到下一個還未出局者
}
}
_for(i, 0, n) if (play[i] == 0) cout << i + 1 << endl;
//system("pause");
return 0;
}
這個題一開始把
這部分錯寫成i=i%n+1;才導致得分只有10分,不過令人驚奇的是,就這樣錯了,運行的時候還是正確的,這錯誤隱藏的實力我給滿分!最后在調試的時候發現了錯誤。我寫的優勢是不用單獨判斷k=1時的特殊情況。因為我給復值的時候就是按順序從左到右的。
亮點:while (play[i] == -1) i = (i+1)% n;
希望你們學會哦!
如果這個題可以用環形鏈表,應該可以更快,直接刪掉多余節點就行。
總結
以上是生活随笔為你收集整理的ccf报数游戏java,CCF 201712-2 游戏 《超越自我,攀登顶峰》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5.7.20mysql修改密码,ubun
- 下一篇: php 获取坐标api,怎么获取百度坐标