您的位置:首页 > 编程语言 > C语言/C++

【CCF-CSP 201712-2】游戏

2018-03-09 21:51 423 查看
问题描述
  有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 <iostream>
#include <fstream>
using namespace std;

#define MAX_LEN 1001
struct child{
int id;
bool visied;
};

child _arr[MAX_LEN];
int n;
int k;

void input();
void print_data();
bool be_out(int id);
int find_vitory();

void input(){
cin >> n;
cin >> k;

// init
for(int i = 1; i <= n; i++){
_arr[i].id = i;
_arr[i].visied = false;
}

}

//void print_data(){
//	for(int i = 1; i <= n; i++){
//		cout<<_arr[i].id<<" ";
//	}
//	cout<<endl;
//}

bool be_out(int id){

if(id%k==0){
return true;
}else if(id%10 ==k){
return true;
}

return false;
}

int find_vitory(){
int account_now = 0;
int index = 1;
int child_left = n;
while(child_left!=1){
//		cout<<"=================="<<endl;
//
//		cout<<"child_left = "<<child_left<<endl;
//		cout<<"index = "<<index<<endl;

if(!_arr[index].visied){

account_now++;
//			cout<<"account_now = "<<account_now<<endl;
//
if(be_out(account_now)){
_arr[index].visied = true;
// cout<<_arr[index].id<<" - out"<<endl;
child_left--;
}
}

index++;
if(index>n){
index -= n;
}

}

int result;
for(int i = 1; i <= n; i++){
if(!_arr[i].visied){
result = i;
break;
}
}

return result;
}

int main(){
input();
// print_data();
cout<<find_vitory()<<endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ CCF 游戏