試題編號: | 201712-2 |
試題名稱: | 遊戲 |
時間限制: | 1.0s |
內存限制: | 256.0MB |
問題描述: |
問題描述 有n個小朋友圍成一圈玩遊戲,小朋友從1至n編號,2號小朋友坐在1號小朋友的順時針方向,3號小朋友坐在2號小朋友的順時針方向,……,1號小朋友坐在n號小朋友的順時針方向。 輸入格式 輸入一行,包括兩個整數n和k,意義如題目所述。 輸出格式 輸出一行,包含一個整數,表示獲勝的小朋友編號。 樣例輸入 5 2 樣例輸出 3 樣例輸入 7 3 樣例輸出 4 數據規模和約定 對於所有評測用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 9。 |
解題思路:
要想實現淘汰機制,又要保證按序進行,使用隊列是最簡單得方法。
隊列採用“先進先出”機制,可以每次從隊列首部取出一個元素進行判斷,符合條件則從尾部繼續插入,不符合條件則不插入
這樣就可以保證多次循環總是按序進行。
C++實現:
#include<iostream>
using namespace std;
#include<queue>
int main()
{
int n,k,num=1;
queue<int> list; //定義一個整型隊列list(先進先出)
cin>>n>>k;
for(int i=1;i<=n;i++)
{
list.push(i); //初始時每個小朋友報的數即就是自己的編號,依次進入隊列中
}
while(list.size()>1) //當隊列中只剩一位小朋友時,遊戲結束
{
int top=list.front(); //top指向 隊列第一個小朋友
list.pop();
if(num%k!=0&&(num%10)!=k) //若該小朋友報的數符合規則,則讓他從隊尾加入繼續遊戲
{
list.push(top);
}
num++; //每判斷一個小朋友,報的數+1
}
cout<<list.front()<<endl;;
return 0;
}