第七届湘计算机程序设计竞赛的学生 报道称,数字游戏

报数游戏

时间限制:1000 ms  |  内存限制:65535 KB

难度:2

描写叙述

    n 个人站成一行玩一个报数游戏。全部人从左到右编号为 1 到 n。游戏開始时,最左边的人报 1。他右边的人报 2,编号为 3 的人报 3,等等。当编号为 n 的人(即最右边的人)报完 n 之后,轮到他左边的人(即编号为n-1 的人)报 n+1,然后编号为 n-2 的人报 n+2。以此类推。当最左边的人再次报数之后,报数方向又变成从左到右,依次类推。

为了防止游戏太无聊,报数时有一个特例:假设应该报的数包括数字 7 或者是 7 的倍数。他应当用拍手取代报数。

下表是 n=4 的报数情况(X 表示拍手)。

当编号为 3 的人第 4 次拍手的时候。他实际上数到了 35。

 人  1  2  3  4  3  2  1  2  3
 报数  1  2  3  4  5  6  X  8  9
 人  4  3  2  1  2  3  4  3  2
 报数  10  11  12  13  X  15  16  X  18
 人  1  2  3  4  3  2  1  2  3
 报数  19  20  X   22  23  24  25  26  X
 人  4  3  2  1  2  3  4  3  2
 报数  X  29 30  31   32  33  34  X  36

给定 n,m 和 k。你的任务是计算当编号为 m 的人第 k 次拍手时,他实际上数到了几。

输入
输入包括不超过 10 组数据。每组数据占一行。包括三个整数 n,m 和 k(2<=n<=100, 1<=m<=n, 1<=k<=100)。输入结束标志为 n=m=k=0。
输出
对于每组数据,输出一行。即编号为 m 的人第 k 次拍手时,他实际上数到的那个整数。
例子输入
4 3 1
4 3 2
4 3 3
4 3 4
0 0 0 
例子输出
17
21
27
35 
来源

source=%E6%B9%96%E5%8D%97%E7%9C%81%E7%AC%AC%E4%B8%83%E5%B1%8A%E5%A4%A7%E5%AD%A6%E7%94%9F%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E7%AB%9E%E8%B5%9B" style="text-decoration:none; color:rgb(55,119,188)">湖南省第七届大学生计算机程序设计竞赛

一道简单的模拟题:要模拟出现的情况,主要要推出一个规律  在边界的位置时,下一个报数的位置就是 2*n-2。(我也不知道是怎么推出来的)

这样就能够推算出 每一个编号 下一个报数的位置;直接进行推断。

#include <cstdio>
#include <cstring>
bool judge(int n)//推断函数,推断是否含7,或者是7的倍数
{
     if( !(n % 7) ) return true;
     while(n)
    {
        if( n % 10 == 7 )
            return true;
        n /= 10;
    }
    return false;
}
int main()
{
    int n,m,k,i;
    while(scanf("%d%d%d",&n,&m,&k)&&n&&m&&k)
    {
        int count=0;
        for(i=7;;i++)
        {
            if(judge(i))
            {
                int x=i%(2*n-2);//得出的是初始编号
                if(x==0)
                 x=2*n-2;
                if(x==m || (x>=n && 2*n-x==m ))//符合题意的情况
                    count++;
                if(count==k)
                    break;
            }
        }
        printf("%d\n",i);
    }
    return 0;
}

还看到别人的还有一种思路,直接找到规律,依据规律暴力求解。

分成了两个部分进行考虑,边界情况就直接是2*n-2,中间的间隔是两个数循环变化的。

#include <cstdio>
#include <iostream>
using namespace std;
bool is7( int n )//推断
{
    if( !(n % 7) ) return true;
    while(n)
    {
        if( n % 10 == 7 ) return true;
        n /= 10;
    }
    return false;
}
int main()
{
    int n, m, k;
    while( scanf("%d %d %d", &n, &m, &k) !=EOF && n+m+k )
    {
        int cnt = 0, period = 2 * n - 2;
        if( n == m || m == 1 )//边界的情况
        {
            for( int i = m; ; i += period ) if( is7( i ) )
                {
                    cnt++;
                    if( cnt == k )
                    {
                        printf("%d\n", i);
                        break;
                    }
                }
        }
        else
        {
            int next = 2 - m;
            for( int i = m; ; swap( next, i ) )//中间的情况
            {
                next += period;

                if( is7( i ) )
                {
                    cnt++;
                    if( cnt == k )
                    {
                        printf("%d\n", i);
                        break;
                    }
                }
            }
        }
    }
    return 0;
}

换一种思路。直接进行模拟,依照先顺序,后倒序进行模拟;

#include <cstdio>
#include <cstring>
bool judge(int n)//推断
{
     if( !(n % 7) ) return true;
     while(n)
    {
        if( n % 10 == 7 )
            return true;
        n /= 10;
    }
    return false;
}
int main()
{
    int n,m,k,i;
    while(scanf("%d%d%d",&n,&m,&k)&&n&&m&&k)
    {
        int pos=0,count=0,flag=0;
        for(i=1;i<=n;i++)//顺序处理
        {
            pos++;
            if(i==m)
            {
                if(judge(pos))
                    count++;
                if(count==k)//搜索到结果了
                {
                   printf("%d\n",pos);
                   break;
                }
            }
            if(i==n)
            {
                i=n-1;//进行倒序处理
                for(;i>=1;i--)
                {
                    pos++;
                    if(i==m)
                    {
                        if(judge(pos))
                            count++;
                        if(count==k)
                        {
                            flag=1;
                            printf("%d\n",pos);
                            break;
                        }
                    }
                }
             if(flag)  break;
             i=1;//回溯到顺序
           }
        }
    }
    return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-07-29 18:37:27

第七届湘计算机程序设计竞赛的学生 报道称,数字游戏的相关文章

“亚信科技杯”南邮第七届大学生程序设计竞赛之网络预赛 (部分题解)

“亚信科技杯”南邮第七届大学生程序设计竞赛之网络预赛 F 自动售货机 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 60            测试通过 : 13  题目描述 教学楼有一台奇怪的自动售货机,它只售卖一种饮料,单价5元,并且只收5元.10元面值的货币,但是同学们都很喜欢喝.这个售货机里没有多余的找零,也就是说如果一个持有10元的同学第一个购买,则他不能获得5元找零,但是如果在他之前有一个持有5

河南省第七届大学生程序设计竞赛 问题 A: 物资调度【简单dfs】

题目描述 某地区发生了地震,灾区已经非常困难,灾民急需一些帐篷.衣物.食品和血浆等物资.可通往灾区的道路到处都是塌方,70%以上的路面损坏,桥梁全部被毁.国家立即启动应急预案,展开史上最大强度的非作战式的空运行动,准备向灾区投放急需物资.   一方有难,八方支援.现在已知有N个地方分别有A1,A2,….,An个物资可供调配.目前灾区需要物资数量为M. 现在,请你帮忙算一算,总共有多少种物质调度方案.假设某地方一旦被选择调配,则其物资数全部运走. 输入 第一行: K     表示有K组测试数据.

2015湘潭市第七届大学生程序设计竞赛 —— Fraction

题目大意: 小数化分数,但是分母限制在[1,1000],很明显的枚举,但是在赛场上的时候傻逼了,无论怎么枚举,怎么二分就是wa,wa到死···········. (ps:我要给出题人寄刀片~~~~),这个题目需要注意的是有可能输出0/1. 1 #include <cmath> 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm>

没有什么不可能—记山东省第六届ACM程序设计竞赛(退役总结帖)

大一下学期,第一次听说了ACM这个词,当时每周六也开设了培训课,但我好像一次也没有去过,当时对这个词并没有什么太大的印象.后来学院里引进了自己的OJ,那时候我连基本的输入输出格式都不懂,当经历了一堆的WA,TLE之后突然换来的一个AC竟带来了莫名的喜悦.后来学院举办了第一届ACM程序设计竞赛,我报名参加了新秀赛和团队赛.三个小时的新秀赛,当时貌似做出了三道,意外的拿到了一等奖,这也成为了我大学生活的一个重要转折点.四个小时的团队赛,做得很艰难,各种不会,最后只做出了一道,排在三等奖的末尾.比赛之

河南省第七届ACM程序设计大赛赛后总结

我们学校ACM集训开始于4月5号(清明节),5月25日在郑州解放军信息工程大学举办,集训耗时50天,但是感觉效果还行,但是也不是太好:我们也已经尽力了,虽然说只拿了个银牌,每份收获的背后,都会有辛勤的汗水,毕竟我们也努力了: 下面说说比赛中的问题:觉得吧,虽说模拟赛参加了很多,但是到了正式的比赛的时候,还是出现了紧张的情况,九点开始比赛,我们AC第一道题的时间是在十点半左右,题目不难而且曾经也做过啊,但是就是调试不好,越调试不好,心里就越急啊:刚开始看题的时间,我们都看了第一道题,意思也都明白,

河南省第六届大学生程序设计竞赛--Card Trick

Card Trick Time Limit: 2 Seconds    Memory Limit: 64 MB Description The magician shuffles a small pack of cards, holds it face down and performs the following procedure: 1. The top card is moved to the bottom of the pack. The new top card is dealt fa

湖南省第九届大学生程序设计竞赛

I Interesting Calculator CSU 过了 TOJ超时了 先记一下 #include <cstdio> #include <cstring> #include <queue> using namespace std; int a[100]; bool b[100010]; int c[100010]; int d[100010]; int x, y; int cas = 1; struct node { int x, t, tt; node(){}

河南省第六届大学生程序设计竞赛--异形卵

异 形 卵 Time Limit: 1 Second    Memory Limit: 64 MB Description 我们探索宇宙,是想了解浩瀚星空的奥妙,但我们却很少意识到宇宙深处藏匿的危险,它们无时无刻不紧盯着我们的地球.如果外星人拜访我们,结果可能与哥伦布当年踏足美洲大陆不会有什么两样,这是历史,也是现实. 在ZDM-777星球上发现的休眠异形卵,其外表与常见的卵不同,表面被一层石墨覆盖.当人走近时,那层石墨开始消融,能看到里面的异形卵正在活动,异形卵是活物,具备一些热量或压力传感器

第六届湘潭市程序设计竞赛 -Happy Number

Happy Number Accepted : 110   Submit : 263 Time Limit : 1000 MS   Memory Limit : 65536 KB  Problem Description Recently, Mr. Xie learn the concept of happy number. A happy number is a number contain all digit 7 or only 1 digit other than 7. For examp