2019年第四届程序设计天梯赛总结

天梯赛练习集链接:Click me!

呼~天梯赛终于结束了,今年我们河南省还是在郑轻比赛,只不过今年逼格高了很多,我明明记得去年郑轻全名还是“郑州轻工业学院”,今年一看,成了“郑州轻工业大学”了!!强啊,这一年时间,我们都不知道呢,直接就升大学了哈哈,我还记得去年我们是在小屋里面休息,然后中午发的盒饭来着,今年就比较厉害了,老师给我们每人发了20块钱的餐票,让我们去他们的餐厅去自己买吃的,哈哈,郑轻的饭说实话吃这还行,比我们学校高端一点。我们学校的是早上八点从平顶山出发的,到了郑轻以后,吃了点东西就去小屋里面休息了,然后趴了一会就开始比赛了。

具体比赛规则就如下了:

  1. 竞赛时长为3小时。
  2. 竞赛中 3 个不同组别使用同一套题目,在同一时间,按照统一评分规则进行比赛。
  3. 参赛队员仅可以携带无计算功能的铅笔或水笔入场。
  4. 参赛队员不能携带任何可用计算机处理的软件或数据(不允许任何私人携带的存储设备或计算器)。
  5. 参赛队员不能携带包括无线电接收器、移动电话等在内的任何类型的通讯工具。
  6. 在竞赛中,参赛队员不得和竞赛专家委员会指定的工作人员以外的人交谈;系统支持人员可以回答系统错误信息等和系统相关的问题。
  7. 竞赛的预定时长为 3 小时,但当竞赛进行一定时间后,竞赛专家委员会主任可以因为出现不可预见的事件而调整比赛时长,一旦比赛时长发生改变,须及时地用统一方式通告所有参赛队员。
  8. 当参赛队员出现诸如擅自移动赛场中的设备,未经授权修改比赛软硬件,干扰他人比赛等妨碍比赛正常进行的行为时,都将被竞赛专家委员会剥夺参赛资格。

不过天梯赛的比赛环境,对我们来说,有一点点特殊的,就是编译器是不太一样的,我们平常做题的时候,都是用的Codeblocks,也比较习惯了,天梯赛的环境是Dev C++ 5.10(C++组)和 eclipse (JAVA组),所以对我们来说,有一点点不友好啊...不过 Dev C++ 使用起来的话,还是比较方便的,如需调试,行号上设置断点以后,直接按F5即可开始调试。

天梯赛的题目分数分配如下:

  • 基础级设 8 道题,其中 5 分、10 分、15 分、20 分的题各 2 道,满分为 100 分;
  • 进阶级设 4 道题,每道题 25 分,满分为 100 分;
  • 登顶级设 3 道题,每道题 30 分,满分为 90 分。

一般情况下,当一支队伍的基础题总分超过 800 分时,其本队进阶部分的题目分数才被判为有效,也就是L1的题目总分达到800分,L2 的题目分数才能算,如果你们队伍 L1 的分数并达标,那即使你们做出了L2的题目,也是不算分数的。然后L2的总分达到400分时,L3 的题目的分数才能算。

作为一个天梯赛105分的小渣渣,我也就能总结一下我自己写出来的题了.....其实我个人感觉吧,今年L1的题除了最后一道,都不难的,应该松松拿到80分的,不过我这次有个最最大的错误,就是卡题了,难受的一批啊,L1的第八题,我用C++处理字符串,然后一直不过,就改成用JAVA做,结果还是没做出来,而且还浪费了我一个小时的时间啊...

L1 1~7(80)加上L2 的第四题(25),一共算是105,成绩不好,但是也总结一下吧。

首先,我左边还是华水大佬,右边还是郑大大佬(去年也是),真滴无语哈哈哈;其次啊,键盘是真滴不太好用,按不动啊...我们算是我们学校的第一队,本来其实说的是L1的题要拿到800分,L2的题才能算分,当我L1拿到80分的时候,进来一个老师,说:由于今年L1的题目偏难,所以今年L1的总分达到600分,即可计算L2的分数;也就是标准降低了20分呗,没什么影响啦。

最最不靠谱的一个地方是啥呢?是 gets() 不能用了...而且好像以后都不让用了;所以我比赛的时候,直接把所有的字符全吃入数组,然后遇到回车跳出,代码大概三行...然后回来之后才发现,其他人昨晚讨论,学长给他们讲了一个好东西,可以吃入一整行字符串,而我恰好不在(哭了...),不过能做出来就行,下面推荐给大家这个好用的东西:

scanf("%[^\n]",str);

不过使用之前如果有输入过回车的话,需要加上一个 “getchar();” 这样就能跟 gets 作用一样啦;

好啦,看看题吧:

                                                                     L1-01 PTA使我精神焕发 (5 分)

PTA使我精神焕发.jpg

以上是湖北经济学院同学的大作。本题就请你用汉语拼音输出这句话。

输入格式:

本题没有输入。

输出格式:

在一行中按照样例输出,以惊叹号结尾。

输入样例:

输出样例:

PTA shi3 wo3 jing1 shen2 huan4 fa1 !

这就不用说了吧,直接输出就可以。

cout << "PTA shi3 wo3 jing1 shen2 huan4 fa1 !" << endl;

 

                                                                              L1-02 6翻了 (15 分)

666.JPG

“666”是一种网络用语,大概是表示某人很厉害、我们很佩服的意思。最近又衍生出另一个数字“9”,意思是“6翻了”,实在太厉害的意思。如果你以为这就是厉害的最高境界,那就错啦 —— 目前的最高境界是数字“27”,因为这是 3 个 “9”!

本题就请你编写程序,将那些过时的、只会用一连串“6666……6”表达仰慕的句子,翻译成最新的高级表达。

输入格式:

输入在一行中给出一句话,即一个非空字符串,由不超过 1000 个英文字母、数字和空格组成,以回车结束。

输出格式:

从左到右扫描输入的句子:如果句子中有超过 3 个连续的 6,则将这串连续的 6 替换成 9;但如果有超过 9 个连续的 6,则将这串连续的 6 替换成 27。其他内容不受影响,原样输出。

输入样例:

it is so 666 really 6666 what else can I say 6666666666

输出样例:

it is so 666 really 9 what else can I say 27

解题思路:

直接先读入一行,然后判断所有元素;若遇到一个6,则从当前元素开始,判断后面有多少个连续的6,然后分情况输出,输出之前还要将已经判断过是6的元素跳过,也就是后移,因为这些元素已经不需要判断了。

代码篇:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
    char arr[1005];
    int i = 0, n = 0, x = 0;
    scanf("%[^\n]",arr); ///吃掉除回车以外所有字符,也就是读入一行
    n = strlen(arr);
    for(i = 0; i < n; i++)
    {
        if(arr[i] == '6')
        {
            x = 1;
            for(int j = i + 1; j < n; j++) ///判断后面多少6
            {
                if(arr[j] == '6')
                    x ++;
                else
                    break;
            }
            if(x > 9) ///后移
                cout << 27, i += x - 1;
            else if(x > 3)
                cout << 9, i += x - 1;
            else
                cout << arr[i];
            x = 0;
        }
        else ///如果不是6,就直接输出这个字符
            cout << arr[i];
    }
    return 0;
}

                                                                        L1-04 心理阴影面积 (5 分)

xlyy.JPG

这是一幅心理阴影面积图。我们都以为自己可以匀速前进(图中蓝色直线),而拖延症晚期的我们往往执行的是最后时刻的疯狂赶工(图中的红色折线)。由红、蓝线围出的面积,就是我们在做作业时的心理阴影面积。

现给出红色拐点的坐标 (x,y),要求你算出这个心理阴影面积。

输入格式:

输入在一行中给出 2 个不超过 100 的正整数 x 和 y,并且保证有 x>y。这里假设横、纵坐标的最大值(即截止日和最终完成度)都是 100。

输出格式:

在一行中输出心理阴影面积。

友情提醒:三角形的面积 = 底边长 x 高 / 2;矩形面积 = 底边长 x 高。嫑想得太复杂,这是一道 5 分考减法的题……

输入样例:

90 10

输出样例:

4000

解题分析:

这题就直接算面积就可以,因为我当时忘了怎么用点到直线的公式,所以直接用了面积差做大三角形面积减去小三角形和梯形。

代码篇:

#include <iostream>
using namespace std;
int main()
{
    int n, m;
    cin >> n >> m;
    cout << 5000 - n * m / 2 - (m + 100) * (100 - n) / 2 << endl;
    return 0;
}

                                                                    L1-05 幸运彩票 (15 分)

彩票的号码有 6 位数字,若一张彩票的前 3 位上的数之和等于后 3 位上的数之和,则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。

输入格式:

输入在第一行中给出一个正整数 N(≤ 100)。随后 N 行,每行给出一张彩票的 6 位数字。

输出格式:

对每张彩票,如果它是幸运的,就在一行中输出 You are lucky!;否则输出 Wish you good luck.

输入样例:

2
233008
123456

输出样例:

You are lucky!
Wish you good luck.

解题分析:

直接判断前三个字符和是否等于后三个字符和就好

代码篇:

#include <iostream>
using namespace std;
int main()
{
    int t;
    char arr[10];
    cin >> t;
    while(t--)
    {
        cin >> arr;
        if(arr[0] + arr[1] + arr[2] ==  arr[3] + arr[4] + arr[5])
            cout << "You are lucky!" << endl;
        else
            cout << "Wish you good luck." << endl;
    }
    return 0;
}

 

                                                                            L1-059 敲笨钟 (20 分)

微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压“ong”韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其中“虫”(chong)和“弓”(gong)都压了“ong”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。

现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。

输入格式:

输入首先在第一行给出一个不超过 20 的正整数 N。随后 N 行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 , 分隔,句号 . 结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过 6 个字符,每行字符的总长度不超过 100,并且下半句诗至少有 3 个字。

输出格式:

对每一行诗句,判断其是否压“ong”韵。即上下两句末尾的字都是“ong”结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出 Skipped,即跳过此句。

输入样例:

5
xun zhang zhai ju lao diao chong, xiao yue dang lian gua yu gong.
tian sheng wo cai bi you yong, qian jin san jin huan fu lai.
xue zhui rou zhi leng wei rong, an xiao chen jing shu wei long.
zuo ye xing chen zuo ye feng, hua lou xi pan gui tang dong.
ren xian gui hua luo, ye jing chun shan kong.

输出样例:

xun zhang zhai ju lao diao chong, xiao yue dang lian qiao ben zhong.
Skipped
xue zhui rou zhi leng wei rong, an xiao chen jing qiao ben zhong.
Skipped
Skipped

解题分析:

首先要解决的难题,就是读入一行,直接用我上面说的那个方法即可,加一个 getchar() 即可;然后,就是需要判断逗号和句号前面三个字符是不是 “o” 、“n” 、“g”,如果不是直接输出 “Skipped” ;如果都是,就判断一下倒数第三个单词开始的位置,也就是倒数第三个空格出现的位置,判断完之后,把这个位置之前的字符原样输出,然后输出 “qiao ben zhong” 即可

代码篇:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
    int t;
    char arr[150];
    cin >> t;
    while(t--)
    {
        getchar();    ///读入一行
        scanf("%[^\n]",arr);
        int len = strlen(arr);
        bool flag = true;
        for(int i = 0; i < len; i++) ///判断','跟'.'之前的三个字符
        {
            if(arr[i] == ',')
            {
                if(arr[i - 3] != 'o' || arr[i - 2] != 'n' || arr[i - 1] != 'g')
                    flag = false;
            }
            if(arr[i] == '.')
            {
                if(arr[i - 3] != 'o' || arr[i - 2] != 'n' || arr[i - 1] != 'g')
                    flag = false;
            }
        }
        if(flag) ///分情况输出
        {
            int x = 0, cut;
            for(int i = len - 1; i >= 0; i--) /// 判断倒数第三个空格的位置
            {
                if(arr[i] == ' ')
                    x++;
                if(x == 3)
                {
                    cut = i;
                    break;
                }
            }
            for(int i = 0; i <= cut; i++) ///倒数第三个空格之前的字符原样输出
                cout << arr[i];
            cout << "qiao ben zhong." << endl;
        }
        else
            cout << "Skipped" << endl;
    }
    return 0;
}

                                                                            L1-061 新胖子公式 (10 分)

根据钱江晚报官方微博的报导,最新的肥胖计算方法为:体重(kg) / 身高(m) 的平方。如果超过 25,你就是胖子。于是本题就请你编写程序自动判断一个人到底算不算胖子。

输入格式:

输入在一行中给出两个正数,依次为一个人的体重(以 kg 为单位)和身高(以 m 为单位),其间以空格分隔。其中体重不超过 1000 kg,身高不超过 3.0 m。

输出格式:

首先输出将该人的体重和身高代入肥胖公式的计算结果,保留小数点后 1 位。如果这个数值大于 25,就在第二行输出 PANG,否则输出 Hai Xing

输入样例 1:

100.1 1.74

输出样例 1:

33.1
PANG

输入样例 2:

65 1.70

输出样例 2:

22.5
Hai Xing

这就不多做解释了,直接贴上代码:

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    double w, h,cul;
    cin >> w >> h;
    cul = w / h / h;
    if(cul > 25)
        printf("%.1lf\nPANG\n",cul);
    else
        printf("%.1lf\nHai Xing\n",cul);
    return 0;
}

 

                                                                              L2-032 彩虹瓶 (25 分)

                                                                 rb.JPG

彩虹瓶的制作过程(并不)是这样的:先把一大批空瓶铺放在装填场地上,然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里。

假设彩虹瓶里要按顺序装 N 种颜色的小球(不妨将顺序就编号为 1 到 N)。现在工厂里有每种颜色的小球各一箱,工人需要一箱一箱地将小球从工厂里搬到装填场地。如果搬来的这箱小球正好是可以装填的颜色,就直接拆箱装填;如果不是,就把箱子先码放在一个临时货架上,码放的方法就是一箱一箱堆上去。当一种颜色装填完以后,先看看货架顶端的一箱是不是下一个要装填的颜色,如果是就取下来装填,否则去工厂里再搬一箱过来。

如果工厂里发货的顺序比较好,工人就可以顺利地完成装填。例如要按顺序装填 7 种颜色,工厂按照 7、6、1、3、2、5、4 这个顺序发货,则工人先拿到 7、6 两种不能装填的颜色,将其按照 7 在下、6 在上的顺序堆在货架上;拿到 1 时可以直接装填;拿到 3 时又得临时码放在 6 号颜色箱上;拿到 2 时可以直接装填;随后从货架顶取下 3 进行装填;然后拿到 5,临时码放到 6 上面;最后取了 4 号颜色直接装填;剩下的工作就是顺序从货架上取下 5、6、7 依次装填。

但如果工厂按照 3、1、5、4、2、6、7 这个顺序发货,工人就必须要愤怒地折腾货架了,因为装填完 2 号颜色以后,不把货架上的多个箱子搬下来就拿不到 3 号箱,就不可能顺利完成任务。

另外,货架的容量有限,如果要堆积的货物超过容量,工人也没办法顺利完成任务。例如工厂按照 7、6、5、4、3、2、1 这个顺序发货,如果货架够高,能码放 6 只箱子,那还是可以顺利完工的;但如果货架只能码放 5 只箱子,工人就又要愤怒了……

本题就请你判断一下,工厂的发货顺序能否让工人顺利完成任务。

输入格式:

输入首先在第一行给出 3 个正整数,分别是彩虹瓶的颜色数量 N(1<N≤10​3​​)、临时货架的容量 M(<N)、以及需要判断的发货顺序的数量 K。

随后 K 行,每行给出 N 个数字,是 1 到N 的一个排列,对应工厂的发货顺序。

一行中的数字都以空格分隔。

输出格式:

对每个发货顺序,如果工人可以愉快完工,就在一行中输出 YES;否则输出 NO

输入样例:

7 5 3
7 6 1 3 2 5 4
3 1 5 4 2 6 7
7 6 5 4 3 2 1

输出样例:

YES
NO
NO

题意解析:

就是说,按顺序给出一行数字的小球,如果当前小球的数字,比之前小球数字大一号,则可以放入瓶子里,否则的话,需要堆放在一边(按给出顺序堆放,而且拿的时候,不能乱拿只能从顶部去拿);所以说,我们只要判断现在给出的球(当前球),能不能放入瓶子里面,如果不能,则堆入角落(栈),这样一轮判断下去,则可以判断出能不能按顺序放入小瓶啦!

注意:

  1. 创建变量的时候,要把栈在里面创建,也就是每组数据需要重新建立一个空栈
  2. 每次使用完以后,负责判断的数据要归为原位,也就是清零;
  3. 每次成功匹配(放入小瓶)以后,都要重新判断栈顶元素是否能放入小瓶,因为不管是给出的小球放入瓶内还是栈顶小球放入瓶内,瓶内所需要的小球号码都会发生变化,所以需要再判断一次;
  4. 将数据堆进栈里面的时候,要判断是否超出题中要求的堆压的数量,超出则不能完成

然后,就到了贴代码的时刻:

#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
int main()
{
    int a[1050], n, maxn, t;
    cin >> n >> maxn >> t; ///maxn为要求的最大堆压数量
    while(t--)
    {                                         ///数据清零,
        int now, x = 1, count = 0, flag = 1;  ///x为当前小瓶内需要的小球号码
        stack <int> s;                        ///count为当前栈内元素的数量
        for(int i = 0; i < n; i++)            ///flag则判断是否溢出要求堆压的数量
            scanf("%d", &a[i]);
        for(int i = 0; i < n; i++)
        {
            now = a[i]; ///now为当前的小球号码
            if(x == now)///匹配成功的话,放入小瓶,当前需要的小球号码改变
                x++;
            else        ///否则压栈,计数增加
            {
                s.push(now);
                count++;
            }
            if(count > maxn) ///若数量超出,则不能完成,跳出循环
            {
                flag = 0;
                break;
            }
            while(!s.empty()) ///循环判断是否匹配
            {
                if(x == s.top())
                {
                    x++;
                    s.pop();
                    count--;
                }
                else
                    break;
            }
        }
        if(flag == 0 || !s.empty()) ///如果数量溢出,或栈内留有元素,则不能完成
            cout << "NO" << endl;
        else
            cout << "YES" <<endl;
    }
    return 0;
}

总的来说,天梯赛还是带给了我很多东西,让我也看到了自己的不足,看到了跟别人的差距,路还很长,加油!

 

OVER!

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
7-8 敲笨钟 (15分) 微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压“ong”韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其中“虫”(chong)和“弓”(gong)都压了“ong”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。 现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。 输入格式: 输入首先在第一行给出一个不超过 20 的正整数 N。随后 N 行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 , 分隔,句号 . 结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过 6 个字符,每行字符的总长度不超过 100,并且下半句诗至少有 3 个字。 输出格式: 对每一行诗句,判断其是否压“ong”韵。即上下两句末尾的字都是“ong”结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出 Skipped,即跳过此句。 输入样例: 5 xun zhang zhai ju lao diao chong, xiao yue dang lian gua yu gong. tian sheng wo cai bi you yong, qian jin san jin huan fu lai. xue zhui rou zhi leng wei rong, an xiao chen jing shu wei long. zuo ye xing chen zuo ye feng, hua lou xi pan gui tang dong. ren xian gui hua luo, ye jing chun shan kong. 输出样例: xun zhang zhai ju lao diao chong, xiao yue dang lian qiao ben zhong. Skipped xue zhui rou zhi leng wei rong, an xiao chen jing qiao ben zhong. Skipped Skipped
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值