CSDN 每日一练用例数据缺失了怎么办?
- 引子
- 1、用例与结果不匹配
- 2、阅读理解困难
- 3、用例数据缺失
- 用例数据缺失,却有人 AC ?
- 神奇的 c++
- 28761 津津的储蓄计划
- 70093 近视的小张
- 小结
- 最后的吐槽
引子
老顾最近几个月经常在 CSDN 举办的周赛上浑水摸鱼,偶尔还能拿个名次。但是也遇到过不少问题,很多算法老顾并没有积累,都是临时想临时写的,所以名次也不会很高。
在周赛的过程中,还有每日一练的刷题过程中,碰到了几个典型的问题,主要问题有:
CSDN 文盲老顾的博客,https://blog.csdn.net/superwfei
1、用例与结果不匹配
这个问题还是比较常见的。
比如拯救爱情https://edu.csdn.net/skill/program/28765?practiceId=19532431 ,老顾也就只能混个 70% 的通过率。
比如硬币的面值https://edu.csdn.net/skill/program/28770?practiceId=19652368 ,嗯这个题目经过反馈,用例已修改
比如环形单向链表https://edu.csdn.net/skill/program/28774?practiceId=19566621,骗分是能 AC 了,但是用例 [[1, 2], [1, 3], [2, 3]],期待返回3 是个什么意思?
2、阅读理解困难
比如喜水青蛙,https://edu.csdn.net/skill/program/28751?practiceId=26238444 ,这个题目问的是不得不踩的石头有多少个
比如括号上色,https://edu.csdn.net/skill/program/28815?practiceId=26943303 ,这个题目的条件是,每对括号至少有一个需要上色
比如套盒子,https://edu.csdn.net/skill/program/28777?practiceId=26819414 ,截止到写本文的时候,还是没弄明白到底怎么套,虽然可以骗分。。。
还有更多更多的题目,描述的不够清晰,这都已经成为 CSDN 的特色了,考的不是算法,而是阅读理解。
3、用例数据缺失
比如津津的储蓄计划https://edu.csdn.net/skill/program/28761?practiceId=1
比如近视的小张https://edu.csdn.net/skill/program/70093?practiceId=1之类的。
用例数据缺失,却有人 AC ?
平时刷每日一练的时候是不知道,用例缺失咱也没办法,提交反馈也没人理会,就当这个题目有问题好了。
结果,这些题目出现在周赛上之后,却发现有人满分了?那是大大的诧异啊。老顾就想问问,这数据都不完整的,你怎么搞成 ac 的?
于是老顾就找到了对应题目的 ac 答案,发现全都是 c++ 的代码。痛苦啊,老顾完全没用过 c++,连个抛异常都不知道怎么弄,更不要说调试了。
好在最终百度出了 c++ 抛异常的方式,于是,老顾就对着两个题目《津津的储蓄计划》和《近视的小张》进行了一番测试。
验证过程老顾已经放到自己的个人社区了。点击上边两个题目的标题,就可以看到老顾的 AC 答案了。
神奇的 c++
那么,到底为什么用 c++ 会 ac 呢?
原来,这些人的代码用的都是 cin >> 运算,而这个运算,有一个神奇的特性,他会将空格、回车之类的,都当做数据分隔符,然后另外一个更为神奇的骚特性就是,如果指定了输入数据的数量,而数据缺失,达不到这个数量,这个时候再执行 cin>> 的时候,会重复录入最后一个数据!
28761 津津的储蓄计划
好家伙。。。。津津的储蓄计划,部分用例只有11个数据,然后 c++ 用 cin>> 就直接把第11个数据重复一遍,当做第12个数据了。。。。行,我是很服气的。
# 津津的储蓄计划
import sys
lines = sys.stdin.readlines()
while len(lines) < 12: # 不足12个数据的,用最后一个数据补充
lines.append(lines[-1])
a,b,c = 0,0,0
for i in range(12):
c += 300 - int(lines[i].strip())
if c < 0:
a = -1 - i
break
b += c // 100
c %= 100
if a < 0:
print(a)
else:
print(b * 120 + c)
70093 近视的小张
另一个题目,近视的小张,则更奇怪了,第二个用例输入是这样的:
第一行两个数字,n 和 m,是 200 160
第二行数据是所有柱子的高度,长度应该是200个,实际录入是170多个
第三行数据是所有柱子的位置,长度确实是200个,这个没问题
第四行数据,是小张所有小伙伴的视力,160个数据也没问题
然后,用 c++ 得到了一个神奇的结果
第一行 n m 没问题
第二行高度 170 多,然后不够200个的部分,由第三行数据补足
第三行位置,前边的数据用来补高度数据,所以位置数据不够200,由第四行数据补足
第四行位置,前边部分数据用来补足了位置信息,所以视力信息不够了,于是重复最后一个数据,直至视力数据够160
然后 c++ 这样的代码就 AC 了。。。。。
# 近视的小张
m,n = map(int,input().split())
h = list(map(int,input().split()))
p = list(map(int,input().split()))
u = list(map(int,input().split()))
if len(h) < n: # 如果高度数据长度不够
z = n - len(h) # 计算缺失多少数据
h += p[:z] # 由后边的数据进行递补
p = p[z:] + u[:z]
u = u[z:] + [u[-1]] * z # 当最后一组数据递补后,由最后一个数据重复进行填充
v = sorted([[p[i],h[i]] for i in range(n)])
f = [v[0]]
for i in range(1,n):
if v[i][1] > f[-1][1]:
f.append(v[i])
for i in range(m):
t = [v for v in f if v[0] <= u[i]]
if len(t) == 0:
print(-1)
else:
print(t[-1][0])
小结
老顾弄到这里,用 c++ 抛出用例后,当时就一口老血要喷到屏幕上,这都叫什么事啊。
可以看到,老顾在个人社区里的答案,就是根据这个逻辑,对数据进行了一下补全,然后也能得到一个 AC 的结果了。
在群里和问哥讨论,被笑称这是一个民间补丁。。。。要不是不知道为什么又人能 AC ,老顾至于费这劲?
总之,在碰到部分题目无法 AC 的时候,应该把用例拉出来看一看,如果是因为数据缺失造成的结果不正确,那么就用这个逻辑,对数据进行一下补充,也许就能 AC 了呢?
最后的吐槽
CSDN 周赛,现在举办了50多期了,老顾是从27期才进来混的,所以很多题目老顾也没见过。
现在这个周赛的人也是在慢慢减少,就不说考试时,有时候提交没有响应,各种幺蛾子频出的填空题,这些乱七八糟的问题了。
关键,你连个正式的反馈渠道都没有啊,亲,这用户要到哪里才能找到能够提交问题的途径啊。
考试小助手最近也消失了,我的考试报告什么时候能修复下?让我下载了再出问题好不好?