問題1
思路及解答
原本我的思路是:統計每個元素出現的個數,如果存在若幹個元素之和等于所有元素個數的一半就是YES,反之是NO。(找的規律,我也不清楚問什麼)
按照這個思路能過好多測試用例,但送出之後通過率為0%,是以思路是錯的,下面有兩個反例說明這個錯誤。
是以思路應該是:統計所有元素的個數,如果 “所有元素個數 < 所有元素個數之和的一半(或者元素的最大次數 < 所有元素個數之和的一半)”,那麼就是YES,否則為NO。可以這樣了解:對于任意元素【x】,如果要使能把【x】消掉,那麼【非x 】的個數要大于等于【x】的個數,也就是說【x】的個數不能大于所有元素個數的一半。對于元素【x】,其他的元素都是【非x】,分析問題宏觀來看。
心得:如果通過率為0%,那麼就想是不是思路錯了,而不是有邊界條件或者沒考慮完全!
# 正确的代碼(統計元素個數可以用哈希表也可以用數組) T = int(input()) for _ in range(T): n = int(input()) a = list(map(int, input().split())) dic = {} for item in a: if item in dic: dic[item] += 1 else: dic[item] = 1 if max(dic.values()) > len(a)//2: print("NO") else: print("YES") ################# 我的錯誤代碼(思路錯的) ################## T = int(input()) # T 組資料 for t in range(T): n = int(input()) a = list(map(int, input().split())) # 存取個元素個數 dic = {} for i in range(n): if a[i] not in dic: dic[a[i]] = 1 else: dic[a[i]] += 1 l = len(list(set(a))) count = list(dic.values()) count.sort() target = sum(count) // 2 if l == n: print("YES") continue if count[-1] > target: print("NO") continue if target in count: print("YES") continue else: for start in range(l): flag = 0 if flag == 0: for end in range(start+1, l): if sum(count[start:end+1]) == target: print("YES") flag = 1 break elif sum(count[start:end+1]) < target: continue else: break else: break if flag == 0: print("NO") continue
問題2
思路及解答
# 思路:類似于爬樓梯,以第i個長度為例,那麼第i-1個長度隻能是1個紅花或k個白花t, k = list(map(int, input().split())),如果是1個紅花,說明是從第i-1個位置“爬”過來的,如果是k個紅花,說明是從i-k那個長度“爬”過來的,是以就是dp[i] = dp[i-1] + dp[i-k]。 t, k = list(map(int, input().split())) N = 100001 tmp = 10**9 + 7 for _ in range(t): length = list(map(int, input().split())) a, b = length[0], length[1] dp = [0] * N dp[0], dp[1] = 0, 1 # dp 的初始值 for i in range(2, b+2): # 因為加了一個 i=0, 是以索引要到 b+1 dp[i] = dp[i-1] + dp[i-k] print(sum(dp[a+1:b+2]) % tmp) # 加了一個 i=0,索引需要是從 a+1 到 b+1
問題3
思路及解答
問題4(還有待優化)
思路及解答
我的思路:
(1) 如果字元串和輸出字元串包含的元素種類不同,那麼該字元串不可以;
(2) 如果字元串長度大于輸出字元串長度,那麼該字元串不可以;
(3) 其餘情況用暴力法判斷:複制字元串 i 次,看是否可以滿足題目條件。
################### 我的代碼60%(逾時) ################## n = int(input()) # 長度限制 T= input() # 發送的字元串 m = int(input()) # 字元串個數 count = 0 for _ in range(m): strs = input() l = len(strs) if set(strs) != set(T): continue if l > len(T): continue else: i = 2 strs0 = strs while len(strs) < n: strs = strs0 * i i += 1 if strs[0:n] == T: count += 1 print(count) ################## 參考的代碼(70%),雖然沒有全A,但我覺得挺好的 ################ n = int(input()) # 長度限制 T= input() # 發送的字元串 m = int(input()) # 字元串個數 count = 0 for _ in range(m): strs = input() times = n // len(strs) + 1 # 是求待判斷字元串應該複制幾次才有可能輸出那個字元串,這裡加一是為了防止,n//len(strs)有餘數的情況,那麼不加一就會造成待判斷字元串乘以這個次數,依舊長度小于T的長度。 strs_new = strs_new * times if strs_new[:n] == T: count += 1 else: continue print(count)
問題5
思路及解答
知識點
1. if _name_ == "main":
2. 輸入的兩種方式
3. Python 中 class 類、self 的用法