• CCF|CSP|模拟试题|游戏


    问题描述
      有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号小朋友获胜。
      给定nk,请问最后获胜的小朋友编号为多少?
    输入格式
      输入一行,包括两个整数nk,意义如题目所述。
    输出格式
      输出一行,包含一个整数,表示获胜的小朋友编号。
    样例输入
    5 2
    样例输出
    3
    样例输入
    7 3
    样例输出
    4
    数据规模和约定
      对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 9。
     
    我的代码:
    #include<iostream>
    using namespace std;
    int main(){
        int n,k;
        cin>>n>>k;
        int *result= new int[n];
        for(int i=0;i<n;i++){
            result[i]=0;
        }//初始化为0,淘汰后置1 
        int tag=0;//淘汰人数tag 
        int num=1;//小朋友报的数 
        bool flag=true;
        while(flag){
            for(int i=0;i<n;i++){
                if(tag==(n-1)){//只剩下一个小朋友 比赛结束 退出大循环             
                    flag=false;break;
                }else{
                    if(result[i]==1){//此小朋友已经淘汰 
                        continue;
                    }else{
                        if(num%10==k||num%k==0){//满足淘汰条件 ///////// n/k  整除 百分号 不是除号 
                            result[i]=1;//表示淘汰了 
                            tag++;//淘汰人数加1 
                        }
                        num++;//报的数递增 
                    }
                }
            }
        }
        for(int i=0;i<n;i++){
            if(result[i]==0){//仅剩的一个result值为0的小朋友 
                cout<<i+1;break;//下标从0起,小朋友编号从1起  
            }
    
        }
        delete []result;
        return 0;
    }


    注意:

    1.动态数组初始化不能通过result[n]={0}; 需要for循环遍历并赋初值0 静态的是可以的 int result[100]={0};对  但注意不能拆开 int result[100];result[]={0};不对

    2.num是k的倍数 等价于 n%k=0 而不是 n/k=0 看了好久才发现这个问题

    3.对于淘汰的小朋友 应该直接continue 最开始我把continue和tag++ num++ 都写在if(满足淘汰条件)的花括号里 是逻辑的错误

  • 相关阅读:
    C++_学习随笔_牛郎织女迷宫
    UE4复习5_蓝图接口简单应用
    UE4复习4_射线检测
    今日份学习: Spring中使用AOP并实现redis缓存?
    动态代理,AOP和Spring
    今日份学习:初步的springboot
    HTML常用标签
    关于类的笔记
    关于编码的一个笔记
    Java Socket例程3 UDP
  • 原文地址:https://www.cnblogs.com/qq1337822982/p/8570586.html
Copyright © 2020-2023  润新知