CSDN 每日一练用例数据缺失了怎么办?

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期才进来混的,所以很多题目老顾也没见过。

现在这个周赛的人也是在慢慢减少,就不说考试时,有时候提交没有响应,各种幺蛾子频出的填空题,这些乱七八糟的问题了。

关键,你连个正式的反馈渠道都没有啊,亲,这用户要到哪里才能找到能够提交问题的途径啊。

考试小助手最近也消失了,我的考试报告什么时候能修复下?让我下载了再出问题好不好?

你可能感兴趣的:(入门,链表,算法,数据结构)