n = int(input())
while n != 0:
students = []
most_popular = 0
count = 0
for i in range(n):
s = list(map(int, input().split()))
s.sort()
students.append(s)
sc = students.count(students[i])
if sc >= most_popular:
if sc > most_popular:
most_popular = sc
count = 0
count += sc
print(count)
n = int(input())
測資3就是過不了
你的程式每循環一次,就會用 list.count() 重新計算一次陣列中有幾個相同元素
list.count() 會從頭開始遍歷整個陣列,尋找有幾個相同的元素,陣列越大消耗的時間就越多
要不試試看先把所有資料都先存起來,最後才統計每個元素出現的頻率? 這樣就只要數一次,而不是每次循環都重新數
當陣列規模可能很大時,就盡量不要去從頭遍歷它
或是一邊讀取,一邊將每個元素出現的次數記錄下來,最後才比較誰出現的最多次
你的程式每循環一次,就會用 list.count() 重新計算一次陣列中有幾個相同元素
list.count() 會從頭開始遍歷整個陣列,尋找有幾個相同的元素,陣列越大消耗的時間就越多
要不試試看先把所有資料都先存起來,最後才統計每個元素出現的頻率? 這樣就只要數一次,而不是每次循環都重新數
當陣列規模可能很大時,就盡量不要去從頭遍歷它
或是一邊讀取,一邊將每個元素出現的次數記錄下來,最後才比較誰出現的最多次
n = int(input())
while n != 0:
students = []
times = []
most_popular = 0
count = 0
for i in range(n):
s = ''.join(sorted(input().split()))
if s not in students:
students.append(s)
times.append(1)
else:
times[students.index(s)] += 1
print(max(times) * times.count(max(times)))
n = int(input())
還是不行,但側資2的時間大概少了一倍(0.1s 到 65ms)
你的程式每循環一次,就會用 list.count() 重新計算一次陣列中有幾個相同元素
list.count() 會從頭開始遍歷整個陣列,尋找有幾個相同的元素,陣列越大消耗的時間就越多
要不試試看先把所有資料都先存起來,最後才統計每個元素出現的頻率? 這樣就只要數一次,而不是每次循環都重新數
當陣列規模可能很大時,就盡量不要去從頭遍歷它
或是一邊讀取,一邊將每個元素出現的次數記錄下來,最後才比較誰出現的最多次
n = int(input())
while n != 0:
students = []
times = []
most_popular = 0
count = 0
for i in range(n):
s = ''.join(sorted(input().split()))
if s not in students:
students.append(s)
times.append(1)
else:
times[students.index(s)] += 1
print(max(times) * times.count(max(times)))
n = int(input())還是不行,但側資2的時間大概少了一倍(0.1s 到 65ms)
**修正前文**
n = int(input())
while n != 0:
students = []
times = []
for i in range(n):
s = ''.join(sorted(input().split()))
if s not in students:
students.append(s)
times.append(1)
else:
times[students.index(s)] += 1
print(max(times) * times.count(max(times)))
n = int(input())
還是不行,但測資2的時間大概少了一倍(0.1s 到 65ms)
有變快那就是有效果了
新的程式碼中,拖你時間的主要是這一行,我用紅色的標記出來
n = int(input())
|
list.index() 的行為和 list.count() 相似,都會從頭遍歷陣列尋找符合的元素
差別在於 list.index() 找到第一個吻合就結束了,時間複雜度是 O(n)
list.count() 則會繼續找,直到遍歷完整組陣列
不過對於計數的部分,特別是元素很多的情況, python 有更有效率的資料類型可以使用 - 字典 dict
字典有一個優勢是無論字典的規模有多大,查找特定元素(鍵)消耗的時間都差不多,時間複雜度是 O(1),速度會更快
這題的話可以用 {組合 : 數量} 這個格式紀錄
我猜大部分用 python 過的人應該都是用字典,其他還有很多題目都需要統計大量元素的數量,都是用字典的效率比較好
但其實還有字典以外的做法能過就是了
另解就是要導入額外的 package
語法是 import 你要導入的包
或 from 你要導入的包 import 那個包裡面的東西
除了其他解題報告用的 itertools 的 groupby 外,我個人其實更推薦用 collections 的 Counter
collections.Counter 就像他的名字一樣,就是專門用來統計數量的,這是它的專業,細節用法可以看這個網站或官方文檔的說明
這東西保存資料的方式類似字典,所以字典能用的方法,它大多也能用
另解就是要導入額外的 package
語法是
import 你要導入的包
或from 你要導入的包 import 那個包裡面的東西
除了其他解題報告用的 itertools 的 groupby 外,我個人其實更推薦用 collections 的 Counter
collections.Counter 就像他的名字一樣,就是專門用來統計數量的,這是它的專業,細節用法可以看這個網站或官方文檔的說明
這東西保存資料的方式類似字典,所以字典能用的方法,它大多也能用
我最後用Counter過了(測資#3 0.4s)(研究了好久,畢竟跟字典不太熟,Counter更是陌生)
不過真的超級感謝你花時間幫我看程式碼,太謝謝你了
另解就是要導入額外的 package
語法是
import 你要導入的包
或from 你要導入的包 import 那個包裡面的東西
除了其他解題報告用的 itertools 的 groupby 外,我個人其實更推薦用 collections 的 Counter
collections.Counter 就像他的名字一樣,就是專門用來統計數量的,這是它的專業,細節用法可以看這個網站或官方文檔的說明
這東西保存資料的方式類似字典,所以字典能用的方法,它大多也能用
我最後用Counter過了(測資#3 0.4s)(研究了好久,畢竟跟字典不太熟,Counter更是陌生)
不過真的超級感謝你花時間幫我看程式碼,太謝謝你了
from collections import Counter
n = int(input())
while n != 0:
students = []
for i in range(n):
s = ''.join(sorted(input().split()))
students.append(s)
s2 = Counter(students)
m= max(s2.values())
count = sum(1 for x in s2.values() if x == m)
print(m *count)
n = int(input())