【CCF-CSP】201712-2游戏100分(含思路解释、详细注释)

故事的开头总是极尽温柔,故事会一直温柔……💜
✨你好啊,我是“ 怪& ”,是一名在校大学生哦。
🌍主页链接:怪&的个人博客主页
☀️博文主更方向为:课程学习知识、作业题解、期末备考。随着专业的深入会越来越广哦…一起期待。
❤️一个“不想让我曾没有做好的也成为你的遗憾”的博主。
💪很高兴与你相遇,一起加油!

一、代码如下:

#include <iostream>

using namespace std;
#define N 	1002//小朋友最多1000个

int k;
int isK(int x){//满足 “若一个小朋友报的数为k的倍数或其末位数(即数的个位)为k	”则返回1 
	if((x%k==0)||(x%10==k))	return 1;
	else return 0;
}

int main(){
	
	int  n;
	cin>>n>>k;//n:小朋友个数	k:若一个小朋友报的数为k的倍数或其末位数(即数的个位)为k,则该小朋友被淘汰出局
	 
	int Sum=n;//小朋友剩余Sum个
	
	int flag[N];// 
	for(int i=1;i<=n;i++){//flag[i]==0,小朋友已出局;flag[i]初始值为1 
		flag[i]=1;
	}
	int num=1;//报的数 
	int ChildFlag=1;//第ChildFlag小朋友报数  
	
	while(Sum>1){//剩余小朋友数Sum>1,一直执行,Sum 
		while(flag[ChildFlag]==0){//跳过已出局的小朋友(即将ChildFlag移到第一个遇到仍未出局的小朋友处) 
			if(ChildFlag==n){ChildFlag=0;}//穷尽小朋友时,应回到第一个小朋友,末尾执行+1,所以此处赋值为0 
			ChildFlag++;
		}
		if(isK(num)==1 && flag[ChildFlag]==1){//此数满足条件,且轮到的未出局小朋友 
			flag[ChildFlag]=0;//出局 
			//cout<<"淘汰了第"<<ChildFlag<<"小朋友"<<endl;
			Sum--;//满足条件,淘汰一个小朋友 
			num++;//报数+1 
			ChildFlag++;//轮至下一个小朋友 
			if(ChildFlag==n+1){ChildFlag=1;} //穷尽小朋友时,重新轮到第一个小朋友 
		}	
		else if(isK(num)==0 &&	flag[ChildFlag]==1){
			//cout<<"没有淘汰"<<endl;
			ChildFlag++;//轮至下一个小朋友 
			num++;//报数+1 
			if(ChildFlag==n+1){ChildFlag=1;} //穷尽小朋友时,重新轮到第一个小朋友
		}
	}
	for(int i=1;i<n+1;i++){
		if(flag[i]==1)cout<<i<<endl;//此时仅仅有一个小朋友未出局,其flag【i】==1 
	}

	return 0;
} 

二、解题思路:

1、设置int flag[n]数组,flag【 ChildFlag】记录轮至第ChildFlag个小朋友报数,若flag[ChildFlag]==1,则该小朋友未出局。值为0,则该小朋友已出局。

2、int isK(int x);判断输入的数x是否满足条件,满足则返回1,否则返回0;

3、while(Sum>1):剩余小朋友数>=2,则一直执行。

        (1),第一个while作用:跳过已淘汰的小朋友。因为通过ChildFlag来存储轮至第i个小朋友报数,应先判断flag【ChildFlag】是否等于0,即是否淘汰,通过while()语句跳过连续的已淘汰的小朋友。

        (2),第ChildFlag报的数num满足条件,则执行相应内容。

        (3),第ChildFlag报 的数num不满足条件,则执行相应内容。

4、关键:ChildFlag至n+1时,将ChildFlag赋值为1。结合实例:小朋友报数一轮后,重新由第一个小朋友报数。(函数中有while语句跳过已出局的小朋友)

三、题目如下: 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪&

感谢您的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值