問題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 的用法