2019Nowcoder Girl题解(python)

 

重现赛地址:https://ac.nowcoder.com/acm/contest/3405#description 

虽然重现赛里面有很多的OC代码和题解可供学习,可直接戳链接

最近每天都在看论文想论文写论文,实在是感觉有点枯燥。所以想给自己找点事情做,间或地打发一下时间,整理一下我乱七八糟的解题思路。

 

A-牛妹爱整数

示例:

输入 3 输出 10 ;输入 5 输出 16 ;输入 9 输出 10

官方题解:抓住题目中k的各位数之和能被x整除,则k能被x整除,其实我们求的是每个整数/整十数/整百数...除以x的余数之和,当余数之和为1的时候,就刚好等于这位数的值。

以题目中的“十六进制数1E能否被5整除”为例,

从高位开始看起:

16 mod 5 = 1

1 mod 5 = 1

而1E = 1*16+E*1

因此

1*16 mod 5 = 1*1 = 1

E*1 mod 5 = E*1 = E

也就是1E mod 5 = (1+E) mod 5

所以在不考虑类型上限大小,只要进制数x满足,x mod k = 1就可以满足题意,也就是任意n*k+1(n≥1)都可以满足题意,此题直接输出k+1就是正确答案。

说实话,题解看了几遍才非常明白(我的理解能力有待提高)

我原本来的想法:把给定的整数k拆成1+(k-1)的形式,对于x进制来说,原来的数就是x+k-1;如果这个数能被各位数之和也就是k整除,那么这个数就能被x整除。样例是都通过了,但是看了题解,我的做法每次得到的就是k+1,算不算是是歪打正着。

# 题解的答案
print(int(input()) + 1)

# 我的提交
def solution(k):
    for x in range(k+1, 10**18):
        y = (x+k-1)
        temp = y // k
        if y == temp*k:
            return x
if __name__ == '__main__':
    k = int(input())
    print(solution(k))

 

B吃桃

这道题我用python3做的,测试用例可以过,提交之后显示“存在语法错误或者数组越界非法访问等情况”,在已通过的代码里也没有找到python版本的,先来说一下我的想法,也不知道对不对。

思路很简单,首先用字典的形式来存储这个无向连通图,然后记录从指定k结点出发可走的路径(利用深度优先遍历),最后从所有路径中挑选出最佳路径(具体见代码),按格式输出就是最终答案。这样看的话时间复杂度和空间复杂度都很高,还没有优化。

官方题解,其思路两步:

  1. DP+DFS找到每个点的所有子节点的最长深度,记录在w[i][j]中,i为父节点的编号
  2. 贪心递归,每次选能走到最长深度的那个子节点
# oc代码见官方题解

# 我的小尝试
def solution(k, d, min_out):
    # print(d[k])
    out = []
    find([k], out, k, d)
    # print('out', out)
    l = max(len(i) for i in out)
    m_out = []
    for t in out:    # 挑选最佳路径
        if len(t) == l:
            if sum(t) <= min_out:
                min_out = sum(t)
                m_out = t
    return m_out
def find(temp, out, k, d):    # 深度优先遍历
    for i in d[k]:
        if i not in temp:
            temp.append(i)
            find(temp, out, i, d)
            temp.pop()
        else:
            out.append(temp[:])
            return
if __name__ == '__main__':
    n, k = map(int, input().split())
    d = {}    # 字典存储图,也就是每个点对应其可及的点
    min_out = 0
    for _ in range(n-1):
        a, b = map(int, input().split())
        min_out += a
        if a not in d:
            d[a] = [b]
        else:
            d[a].append(b)
        if b not in d:
            d[b] = [a]
        else:
            d[b].append(a)
    # print(d)
    out = solution(k, d, min_out)
    for i in out:    # 按输出格式输出
        print(i)

 

C 揹包问题

 

D 泡面

 

E 伪直径

 

F 最大最小差

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章