ccf 201912-1 报数 牛刀杀鸡(队列实现 AC100分)

    科技2024-05-24  79

    【题目描述】

      甲乙丙丁决定玩一个报数的游戏来打发时间。游戏规则为四个人从1开始轮流进行报数,但如果需要报出的数是7的倍数或含有数字7则直接跳过。

      此外大家约定,在总共报出了n个数后(不计入被跳过的数)游戏结束。现在需要你来帮忙统计,游戏过程中每个人各自跳过了几次。

    【输入格式】

      从标准输入读入数据。  输入仅一行,包含一个正整数n,表示报出了多少个数后游戏结束。

    【输出格式】

      输出到标准输出。  输出共四行,每行一个整数,以此表示甲乙丙丁四人在游戏过程中跳过的次数。

    【样例输入】

    20

    【样例输出】

    2 1 1 0

    【样例解释】

    报数过程为: 甲:1,乙:2,丙:3,丁:4 甲:5,乙:6,丙:跳过,丁:8 甲:9,乙:10,丙:11,丁:12 甲:13,乙:跳过,丙:15,丁:16 甲:跳过,乙:18,丙:19,丁:20 甲:跳过,乙:22,丙:23,丁:24 在丁报出24后,四个人总计报出了20个数,游戏结束。

    【预备知识-队列的用法】

      c++的队列queue模板类定义在头文件中。   队列遵循先进先出原则,也就是说新加入的元素会放在队尾。   queue的常见操作:

    声明一个队列:queue<int>q;q.size()返回队列长度q.empty()队列为空,则返回trueq.push(a)将a放到队列的末端q.front()返回队首的元素(也就是队列第一个元素,先进先出)q.pop()弹出队列第一个元素(不返回任何值)q.back()返回最后被加入到队列的元素(也就是队尾元素)

    【AC-c++代码如下】

    #include<iostream> #include<queue> using namespace std; //bool类型函数,判断报出的数是否是7的倍数或者含有7 bool judge(int x){ if(x%7==0) return true;//判断是否为7的倍数 while(x!=0){//判断数字中是否含有7 int y=x%10;//提取个位数字 if(y==7) return true; x=x/10;//将各位数字抹去,继续判断下一位,直到变成0跳出循环 } return false; } int main(){ int a[4]={0,0,0,0};//用来存放甲乙丙丁跳过的次数 queue<int> person; for(int i=0;i<4;i++){//将数组下标存入队列 person.push(i); } int n; cin>>n; for(int j=1;j<=n;j++){//模拟甲乙丙丁报数 int temple; temple=person.front(); if(judge(j)){ a[temple]++;//根据题意符合条件的话计数+1,并多报一次数,所以让循环次数+1 n++; } person.pop();//报完数放回队尾参与下一轮报数 person.push(temple); } for(int k=0;k<4;k++) cout<<a[k]<<endl; return 0; }
    Processed: 0.012, SQL: 8