CSP 2017年12月第2题 游戏

CSP 2017年12月第2题 游戏

  1. 在这里 发现了一个之前的一个错误想法:对一个数组 初始化为 同一个数据

    int arr[100]={0};
    //这样在全局数组 是会将其 全部初始化为 0
    
    int arr[100]={-1};
    //在全局数组 这样只会将第一个元素 设置为 -1,其余默认设置为 0

    在全局变量 可以将其全部设置为0,但是 若在局部数组,则会是不确定的数据

    (这个问题 我还是重新写一个笔记吧)

  2. 这题可以直接对数组进行操作即可,下面是思路

    建立一个数组,里面需要存放当前学生报数 的数据,一开始初始化为 0

    设置变量 number 和 index 分别作为 当前报数 和 数组下标索引

    1. 若过当前 数据为 -1 ,表示已经淘汰,然后使得 index++

    2. 若 下标index > n 表示 报数已经经过一轮(包括已经淘汰的人员)

    3. 若过没有淘汰,则让报数 +1,然后存储下当前的 报数

      并且判断 当前报数是否要被淘汰

      如果淘汰,则使得数据为 -1,然后人数 -1,下标 +1

    4. 直到最后 人数剩下 一个 结束

    5. 然后找到那个没有被淘汰的下标即可

  3. 下面源码展示

#include<bits/stdc++.h>
using namespace std;

int arr[1010]={0};
int main()
{
    int n,k;
    cin>>n>>k;

    int num=n;
    int number=0;//表示现在报数 多少
    int index=1;//从下标 1 开始
    while(num!=1)
    {
        if(arr[index]==-1)
            index++;

        if(index>n)
            index=1;

        if(arr[index]!=-1)//表示没有淘汰
        {
            number++;//报数 +1
            arr[index] = number;
            if(number%k == 0 || number%10 == k)
            {
                arr[index]=-1;
                num--;//人数 -1
            }
            index++;//下标+1 指向下一个
        }
    }

    for(int i=1;i<=n;i++)
        if(arr[i]!=-1)
            cout<<i;

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值