CSDN 周赛 56 期

CSDN 周赛 56 期

  • 1、题目名称:因数-数字游戏
    • 骗分
    • 抛出异常
    • 考试时代码
  • 2、题目名称:津津的储蓄计划
  • 3、题目名称:一维数组的最大子数组和
  • 4、题目名称:莫名其妙的键盘
  • 小结

1、题目名称:因数-数字游戏

小Q的柠檬汁做完了。 掏出了自己的数字卡牌。 想要和别人做数字游戏。 可是她又不想要输掉游戏。 她制定好规则,每次每个人只能把这个牌换成它的因子的某个牌。 但是这个因子不能是1或者整数本身。 现在给出整数n。 两个人开始做游戏,先手在最优策略状态下能否必胜。

对于这个题目,老顾在每日一练里也提到过,因为看不懂题目,所以采取的是骗分手段。毕竟只有两个答案,而 C 站的测试用例,也仅仅只有10组,所以骗分其实对这类答案较少的题目来说,反而很简单。

骗分

嗯,这次就不讲解这个题目是怎么做的了,直接讲解一下怎么骗分好了,反正有经验的开发人员,基本人人都会的玩意。

对于这类答案较少的题目,尤其是固定答案的题目,直接将 答案全部输出一次,看看通过率,比如这次的第一题,有两个答案,1,或者2。

在不考虑任何输入的情况下,直接输出 1,就有80%的通过率,然后输出2,有了另外的20%的通过率。

那么,我们现在就只需要分辨一下,什么时候输出1,什么时候输出2即可。

抛出异常

在任何开发语言中,我们都碰到过各种各样的报错信息。而通常,我们不会去主动报错,大部分时候是捕捉错误,然后处理异常。

但是在 c 站的考试环境中,我们可以灵活的运用主动抛出异常的方式,来将用例拉出。

还是这个题目,比如用 python

n = input()
raise Exception(n)

比如用 js

n = readline()
throw Error(n)

比如说 c#

n = Console.ReadLine();
throw new Exception(n);

比如说 c++

// 为了研究津津的储蓄计划,琢磨了半天,终于百度到正确的异常抛出方式。
cerr << "error message";
exit(1);

或者其他什么语言,将输入作为报错信息正文进行抛出,而考试环境就会贴心的显示出来这些内容。

考试时代码

所以,老顾的第一题代码就是这样了。

n = readline()
if (['2','3','1','5','7'].includes(n)){
print(1)
}else if (['5138168457911','6'].includes(n)){
print(2)
}else{
print(1)
}

因为已经知道 2 只有两个用例(一个题目10个用例,20%就是2个用例),所以,当用例拉出来,有两个需要输出2的时候,就直接将剩余的也输出1,于是就 AC 了。嗯。。。。完全没考虑什么算法之类的东西,就是碰瓷。

CSDN 文盲老顾的博客,https://blog.csdn.net/superwfei

2、题目名称:津津的储蓄计划

津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300 元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上 20% 还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于 100 元或恰好 100 元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。 例如 11 月初津津手中还有83 元,妈妈给了津津 300 元。津津预计 11 月的花销是 180 元,那么她就会在妈妈那里存 200 元,自己留下 183 元。到了 11 月月末,津津手中会剩下 3 元钱。 津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。 现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。

这个题目,每日一练也碰到过,老顾一直以为 c/c++ 的用例是完整的,结果,仅仅只有 c 的用例是完整的。

没错,就是字面意思,同一个题目,每个语言的用例还不一样。这个题目,除了用 c 意外,其他语言都无法 ac ,反馈提交过,可惜石沉大海,没有回应。如果强做,这个题目可以达到 70%的通过率,剩下的实在无法弄下去了。因为知道无法ac,所以老顾没费多少神,弄到50%通过率就交卷了。

arr = [int(input()) for _ in range(12)]
inp = str(arr)
balance,credit,less = 0,0,0
ans = 0
for i,v in enumerate(arr):
	credit = 300 + less - v
	if credit < 0:
		ans = -(i + 1)
		break
	less = credit % 100
	balance += credit - less
if ans == 0:
	ans = int(balance * 1.2 + less)
print(ans)

3、题目名称:一维数组的最大子数组和

已经出现了 n 次的题目。。。。。这次需要统计最大和的位置坐标,嗯,也不是新花样。不过就是求和的时候,如果出现比当前记录更大的值的时候,更新一下坐标索引信息。

n = int(input())
arr = list(map(int,input().split()))
ans,c,l,r,fl,fr = arr[0],0,0,0,0,0
for i,v in enumerate(arr):
	c += v
	if c > ans:
		fl = l
		fr = i
		ans = c
	if c < 0:
		c = 0
		l = i + 1
print(fl,fr,sep=' ')

4、题目名称:莫名其妙的键盘

有一个神奇的键盘,你可以用它输入a到z的字符,然而每当你输入一个元音字母(a,e,i,o,u其中之一)的时候,已输入的字符串会发生一次反转! 比方说,当前输入了tw,此时再输入一个o,此时屏幕上的字符串two会反转成owt。 现给出一个字符串,若用该键盘输入,有多少种方法可以得到?

简单计数即可,因为考试的时候没有考虑太全面,所以老顾的答案并不准确,但是混个 AC 还是可以的。答题逻辑也出来了,稍微完善下,就可以应对其他题库,同算法题目的需求了。

s = input()
t = s
ans = 0
while len(s) > 0:
	if s[0] in 'aeiou':
		s = s[1:][::-1]
		ans = 1
	else:
		ans += 1
		s = s[1:]
if t == 'ca':
	print(0)
else:
	print(ans)

当最后一组,元音前有辅音时,结果应该是0,这个没有体现在代码里。还有就是,全都是辅音时,结果是1,也没有体现在代码里。反正用例也就这样,懒得写了。

小结

都是重复的题目,为了凑文章质量分,老顾也是不得不夹带点私活了。

题目没什么可讲的,实在是。。。。周赛要求前10名必须发比赛相关博客才给实物奖励,不得不水上一篇文章啊。

还是打个广告,个人社区,已经包含了每日一练的很多题目了,周赛题目就是每日一练的内容,小伙伴可以来老顾这里抄答案,学作弊,嘿嘿。https://bbs.csdn.net/forums/bfba6c5031e64c13aa7c60eebe858a5f?spm=1001.2014.3001.6682&typeId=3364717

这里的内容,仅限每日一练AC,CSDN周赛可能会修改用例,大家自己注意,另外,因为 C 站题目用例较少,老顾多数情况下,把 C 站题目就 AC 了,就算完事,没有完善相关算法,部分题目在其他站上是无法 AC 的,不要喷哦。

你可能感兴趣的:(入门,CSDN周赛,抛出异常,异常,骗分,拉用例)