天梯赛L1攻略


前言

  花了大概一周的时间去pintia肝了天梯赛的所有L1题目,一共是64题,有一道题目wa了一个点,除此之外全部AC,写博客记录下这一周的心得收获。


一、天梯赛题目介绍:

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

其实这比赛是IOI赛制,每道题提交之后都可以看到返回结果。每道题都有多个测试点,根据每道题通过的测试点的数量获得相应的分数。满分290,今天讲的就是L1,也就是基础级,其实基础题基本都是水题,不会涉及到什么算法。

二、L1题目概述:

L1题目分了4个分数,5分、10分、15分、20分。

  • 5分的题基本都是入门送分题、编程语言语法题,比如各种输出helloworld题目。
  • 0分的题目都是大学编程语言课本后面的简单练习题,比如判断奇偶数、素数,简单的if else判断题、对数组里面的数字求和。
  • 15分的题目基本比10的题目难一点点,稍微绕一点点,输出格式复杂点,大部分是复杂点的if else判断、嵌套for循环练习题,比如身份证校验码、计算矩阵、字符串简单处理。
  • 20的题目相对麻烦一点,但不用慌不会涉及到什么经典的算法,只是和前面的题比起来会更加细节一点,输入输出有些坑,会涉及到一些数学知识,比如(因子、gcd、字符串处理)+比较复杂、细节的处理。

三、攻略&&计划:

  根据陈越老师的知乎帖子,我们可以看到其实L1的题并不难,要求是要在40min之内满分,如果是没有提前准备好好练的话还是有难度的。

1、认真读题,包括样例,输入输出格式、各个细节条件,分析题目的各种情况
  10分、15分、20分的题目坑特别多,一定要认真地读题,注意题目描述的各种细节,有一些题目它可能会有各种各样的特殊情况,要尽可能的考虑各种各样复杂的情况。
  比如这题求整数段和,注意输出格式,每个数字向右对其占5个字符宽度,sum = x,等于号前面后面有空格,如果是没经验的新手不懂得直接赋值粘贴样例的话很可能把空格漏掉。

  再比如这道题目N个数求和,一看到N<100可能会下意识把分子分母一起定义成int,题目说的很清楚在long long范围内。它的输出结果就是让你输出整数部分+分数部分,当我们用正常的思路求出最终的分数(可能是一个假分数)之后,注意分母分子没有公因子,也就是最后分子分母还要除以他们的gcd,在求gcd的过程中要注意可能会有负数,要把负数弄成绝对值,gcd的时候也有可能是0,注意0做被除数是会报错的,记得特判。它的最终结果有很多种形式,比如 2 3/7、0 3/7、2 0/7、0 0/7,特殊的输出格式要特殊判断。

在这里插入图片描述
  再比如这道题目输出是要求行的首尾没有多余空格,平时做的题目都是没有这种奇怪的格式,很多都忽略掉首尾的空格、换行,但天梯赛对输入输出都是有严格要求的,对不上就是错了。除此之外输入也是一样,有一些朋友可能和我一样,会习惯地把字符串首尾空格去掉,或者是一些输入输出会把空格、换行之类的省略掉, 这些都是要注意的地方(代码写起来很不舒服)。

在这里插入图片描述

2、优化代码,在保证思路正确、代码可读性强的前提下,代码越短越好:(文字描述地不是很好,看例子容易理解)
  很多时候一些模拟题代码可能会很长,在保证思路正确的前提下,我们要尽可能地让代码越短越好,这样写比较复杂的模拟不容易出错,即使出错了也容易找到错误。这个具体的优化有很多,就得看日常的积累,比如可以一次做完的事情就不要分两次来做,举个例子,输入一个整数n,然后输入n个整数,输出它们的最小值,没有经验的小白可能会先把输入的数字存放到数组里,然后在数组里查找最小值,其实不用这么麻烦,我们可以一边输入一遍求最小值,这样的话代码就少了一个循环,而且数组也用不上了。再比如可以把题目里复杂、麻烦的一些特性转化成巧妙的代码,再举个例子,判断一个月份的天数是否合法,1、3、5、7、8、10、腊,小白可能会在if后面写上很长的表达式拼在一起,其实直接把月份的天数放在数组里就好了,下标作为月份,数组的值作为天数,再比如一些搜索题目,需要走上下左右四个方向,有同学刚开始很可能直接写,导致代码又长又复杂,其实只要用二维数组就可以了,int[][] arr={{1,0},{0,1},{0,-1},{-1,0}}。我举的例子很简单,但是很多复杂的模拟题的代码是可以按照这些小技巧去简化代码的,不仅不容易出错,而且代码可读性高。
  来看下天梯赛L1的题目,比如这题整除光棍,这道题的大概思路是不断地把被除数乘10加1,然后用除法除以x,直到能被n整除,最后得到除数和商,具体做法就不讲了,感兴趣可以去百度下。我一开始是用乘法做的,边界条件分析了很久,代码写得很长,最后虽然ac了但花了很多时间,然后我去百度了一下题解,发现可以倒着想用除法做,不仅思路简单而且代码还短。

  再比如这题6翻了,涉及到了字符串处理,直接写代码还是蛮复杂的,如果用正则表达式做代码就很短。

在这里插入图片描述

3、关于语言,C/C++ or Java?

  有条件的建议双开,c++和java都用,不行的建议c++,处理字符串、日期类、高精度的时候Java比较方便,编译器的提示和快捷键写起来也快,不要小看这点时间,简单的题目大家都会那就是拼手速了。但数据量偏大的时候就不要用java了,很容易超时,天梯赛在时间方面对Java并不友好,平时的题目数据量都是1秒5*10^7左右,但L1的题目时间并不是1s,很多都是200ms、400ms。

在这里插入图片描述

  当数据量到104到105方左右,用java写大概率会tle,L1题目里面是基础题,没有涉及到啥经典的算法题,所以要是tle了要么语言问题,要么是写了死循环卡住了,同样的代码换成了c++就ac了。要是不会c/c++的话参加这比赛maybe会白给。

4、其它一些输入输出、一些反人类的坑

  输入输出之前已经讲过了,这里讲一下更细节的东西,关于输入输出。有时候处理字符串要用空格把长的字符串分割成多个字符串,分割的时候会把空格去掉,如果要用到字符串的下标那么这时候的下标是不准确的。包括字符串的头尾输入输出是否有空格、是否换行,天梯赛都是有要求的,一定要按照它的要求去做,有时候会出现样例和题意对不上的情况,比如说题目要求输出最后不能有空格,给的样例却多了一个空格,以题目为准就好了,难怪陈老师说会搞字符串就已经赢了99%的选手。还有一些反人类的坑,正常情况下题目没有把所有的情况说清楚或者我们没有彻底理解题意的话,我们是以自己的生活经验常识为准的。
  比如这题N个数求和,答案有很多种类型,0 2/7我们会写成2/7、2 0/7写成2、0 0/5 写成0,前面说了是有理数的形式,有同学可能不太明白有理数形式是怎么样的形式,所以是以自己的生活经验常识为准的,这道题目也没啥问题。

在这里插入图片描述

  但有时候题目没有说,按照自己生活经验的理解却不是题目的意思,这种就是有点反人类的坑,比如阅览室这道题,同一本书的有多种借阅情况,比如 S、S、S、E,按照我们的生活经验,只有一本书借阅情况肯定是以第一次的S为准,但以第一次的S为准的话就会wa掉一个点,要以最后一次的S为准才能AC。

在这里插入图片描述

  正常情况下例如数组越界这种情况下OJ会返回一个运行时错误,但天梯赛有时候并不会告诉你你的代码运行时错误,会告诉你答案错误,本来是代码的错误让你误以为是思路有问题。

5、总是AC不了怎么办?

  这一点是我个人的经验,我也不是什么大神,仅供参考。

  • 如果所有点都wa了,大概率是你漏了什么很重要的条件,导致所有的点都wa了,回去认真看一下题目,如果题目没理解错,那么可能就是代码写错了,漏了关键的步骤,又或者是输入输出的处理弄错了。
  • 如果是wa了一部分点,大概率是一些边界条件、特殊情况没考虑到,又或者代码不完整,漏了一些条件、爆int之类的,这时候请认真地把题目逐字逐字读透彻,如果确定了题目没有问题,代码也找不出错误,根据题意给的条件尝试各种条件去"挑刺",比如输入一个数字,让你排序,你可以输入各种各样的特殊样例去挑刺。例如已经排好序的数组[1,2,3,5,6]、完全逆序的数组[5,4,3,2,1]、全部为负数的数组[-1,-5,-2,-3]等等,尝试着去"挑刺",有时候挑着挑着就会发现漏掉了哪些条件。
  • 如果tle了,大概率是写了很长的循环,或者尝试换c++语言,L1是不会有什么经典的算法题。

四、总结

  L1的题目不难,但要尽可能快速地通过并且满分,大部分是很简单的大学课本后面的练习题,其中注意输入输出要严格地按照题意走,很多题目会用到字符串,各种字符串操作要熟练,数据量感觉有点大的用c++不然可能会超时。

  看到了这里,感谢你的阅读,我是可乐,平时还要上班,码字不易,如果有不足之处请留下你的评论。

  • 32
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值