• ccf-201712-2


    问题描述

    试题编号: 201712-2
    试题名称: 游戏
    时间限制: 1.0s
    内存限制: 256.0MB
    问题描述:
    问题描述
      有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。
     
     
    分析,本题题目不难,就是一个报数模拟器,然后淘汰满足一定条件的数
    因为本题的用例范围不大,如果直接暴力的话,时间复杂度是10000,然而k越小时间复杂度就越小,所以本题可以用数组暴力来做
    代码如下
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    
    using namespace std;
    
    int main()
    {
        int n,left,k,a[1005];
        cin>>n>>k;
        for(int i=1;i<=n;i++)
        {
            a[i]=1;
        }
        left=n;
        int i=1;
        int number=1;
        while(left>1)
        {
            if(!a[i])
            {
                if(i==n)
                   i=1;
                else
                   i++;
                continue;
            }
            if(number%k==0||number%10==k)
            {
                a[i]=0;
                left--;
            }
            //cout<<"number"<<number<<"i"<<i<<endl;
            number++;
            if(i==n)
            {
                i=1;
            }
            else
            i++;
        }
        for(int i=1;i<=n;i++)
        {
            if(a[i])    cout<<i<<endl;
        }
        return 0;
    }
    

     不过本题最快最易理解的方法是用队列来做

    以下是我的ac代码

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <queue>
    
    using namespace std;
    
    int main()
    {
        queue <int> q;
        int n,k;
        cin>>n>>k;
        for(int i=1;i<=n;i++)
        {
            q.push(i);
        }
        int num=1;
        while(q.size()>1)
        {
            int t=q.front();
            q.pop();
            if(num%k!=0&&num%10!=k)
                q.push(t);
            num++;
        }
        cout<<q.front()<<endl;
        return 0;
    }
    

     

     

     
  • 相关阅读:
    js获取浏览器和屏幕的各种宽度高度
    闭包
    原型与原型链
    vuex
    微信小程序天使童装答辩
    vue脚手架本地开发跨域请求设置
    mvvm和mvc
    Vue 中 methods,computed, watch 的区别
    keep-alive
    YII2组件之GridView
  • 原文地址:https://www.cnblogs.com/muziqiu/p/10450722.html
Copyright © 2020-2023  润新知