天天看點

csp試題2:遊戲

csp試題2:遊戲

    • 題目
    • 分析
    • 代碼
    • 總結

題目

      有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,意義如題目所述。

輸出格式

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

樣例1

輸入:

5 2
           

輸出:

3
           

樣例2

輸入:

7 3
           

輸出:

4
           

資料規模和約定

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

分析

      模拟運作類的的題目。遊戲的進行過程就是解題思路。具體過程已在代碼中用注釋給出。

代碼

/*
20190922
csp試題2:遊戲 
*/ 

#include <iostream>
using namespace std;

int main(){
	//接收資料
	int n, k;
	cin >>n >>k;
	
	//模拟運作
	//1.初始n個小朋友
	int stu[n];
	for(int i=0; i<n; i++){
		stu[i] = 0;
	}
	
	int number = 1;	//報的數字 
	int index = 0;	//用于選擇該哪一個小朋友 
	int rest_num = n;	//剩下的人數 
	while(rest_num != 1){
		//2.如果沒被淘汰
		if(stu[index] != -1){
			//報數 
			stu[index] = number;
			
			//判斷此次報數是否會被淘汰
			if(stu[index]%k == 0 || stu[index]%10 == k){
				stu[index] = -1;	//被淘汰 
			} 
			
			//選擇下一個小朋友
			index++;
			number++; 
		}
		else{	//如果被淘汰,則跳過此小朋友,讓下一個下朋友報數 
			index++;
		}
		
		//3.當這一輪進行到最後一個小朋友時,從頭開始 
		if(index == n){
			index = 0; 
		} 
		
		//4.判斷是否隻剩下一個小朋友
		rest_num = n; 
		for(int i=0; i<n; i++){
			if(stu[i] == -1){
				rest_num--;
			}
		} 
	} 
	
	//5.輸出
	for(int i=0; i<n; i++){
		if(stu[i] != -1){
			cout <<i+1<<endl;
		}
	} 
	
	return 0;
} 
           

總結

      這類模拟運作類的題目還是相對較簡單的。在最後對stu[ ]進行了兩次循環周遊,當然有while循環,實際上不止兩次,這段代碼還可以再進行優化。