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 最大最小差

 

 

 

 

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