#44244: python TLE求救


hansjiang1017@gmail.com (單純想出題所以在拚30%)

學校 : 不指定學校
編號 : 278037
來源 : [111.242.102.214]
最後登入時間 :
2024-11-12 18:30:55
b265. Q11286 - Conformity | From: [111.242.102.214] | 發表日期 : 2024-11-17 15:59

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就是過不了

 
#44246: Re: python TLE求救


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 不指定學校
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2024-11-21 19:18:13
b265. Q11286 - Conformity | From: [123.192.228.253] | 發表日期 : 2024-11-17 17:02

你的程式每循環一次,就會用 list.count() 重新計算一次陣列中有幾個相同元素

list.count() 會從頭開始遍歷整個陣列,尋找有幾個相同的元素,陣列越大消耗的時間就越多

 

要不試試看先把所有資料都先存起來,最後才統計每個元素出現的頻率? 這樣就只要數一次,而不是每次循環都重新數

當陣列規模可能很大時,就盡量不要去從頭遍歷它

 

或是一邊讀取,一邊將每個元素出現的次數記錄下來,最後才比較誰出現的最多次

 
#44255: Re: python TLE求救


hansjiang1017@gmail.com (單純想出題所以在拚30%)

學校 : 不指定學校
編號 : 278037
來源 : [111.242.102.214]
最後登入時間 :
2024-11-12 18:30:55
b265. Q11286 - Conformity | From: [111.242.102.214] | 發表日期 : 2024-11-18 18:03

你的程式每循環一次,就會用 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)

 
#44256: Re: python TLE求救


hansjiang1017@gmail.com (單純想出題所以在拚30%)

學校 : 不指定學校
編號 : 278037
來源 : [111.242.102.214]
最後登入時間 :
2024-11-12 18:30:55
b265. Q11286 - Conformity | From: [111.242.102.214] | 發表日期 : 2024-11-18 18:25

你的程式每循環一次,就會用 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)

 
#44263: Re: python TLE求救


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 不指定學校
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2024-11-21 19:18:13
b265. Q11286 - Conformity | From: [123.192.228.253] | 發表日期 : 2024-11-18 20:43

有變快那就是有效果了

新的程式碼中,拖你時間的主要是這一行,我用紅色的標記出來

 

n = int(input())
while n != 0:

    # 略...

    for i in range(n):
        s = ''.join(sorted(input().split()))
        if s not in students:
            # 略...


        else:
            times[students.index(s)] += 1


    # 略 ...

 

list.index() 的行為和 list.count() 相似,都會從頭遍歷陣列尋找符合的元素

差別在於 list.index() 找到第一個吻合就結束了,時間複雜度是 O(n)

list.count() 則會繼續找,直到遍歷完整組陣列

 

不過對於計數的部分,特別是元素很多的情況, python 有更有效率的資料類型可以使用 - 字典 dict

字典有一個優勢是無論字典的規模有多大,查找特定元素(鍵)消耗的時間都差不多,時間複雜度是 O(1),速度會更快

 

這題的話可以用 {組合 : 數量} 這個格式紀錄

我猜大部分用 python 過的人應該都是用字典,其他還有很多題目都需要統計大量元素的數量,都是用字典的效率比較好

但其實還有字典以外的做法能過就是了

 
#44264: Re: python TLE求救


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 不指定學校
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2024-11-21 19:18:13
b265. Q11286 - Conformity | From: [123.192.228.253] | 發表日期 : 2024-11-18 21:11

另解就是要導入額外的 package

語法是 import 你要導入的包from 你要導入的包 import 那個包裡面的東西

 

除了其他解題報告用的 itertools 的 groupby 外,我個人其實更推薦用 collections 的 Counter

 

collections.Counter 就像他的名字一樣,就是專門用來統計數量的,這是它的專業,細節用法可以看這個網站官方文檔的說明

這東西保存資料的方式類似字典,所以字典能用的方法,它大多也能用

 

 
#44284: Re: python TLE求救


hansjiang1017@gmail.com (單純想出題所以在拚30%)

學校 : 不指定學校
編號 : 278037
來源 : [111.242.102.214]
最後登入時間 :
2024-11-12 18:30:55
b265. Q11286 - Conformity | From: [111.242.105.24] | 發表日期 : 2024-11-19 20:42

另解就是要導入額外的 package

語法是 import 你要導入的包from 你要導入的包 import 那個包裡面的東西

 

除了其他解題報告用的 itertools 的 groupby 外,我個人其實更推薦用 collections 的 Counter

 

collections.Counter 就像他的名字一樣,就是專門用來統計數量的,這是它的專業,細節用法可以看這個網站官方文檔的說明

這東西保存資料的方式類似字典,所以字典能用的方法,它大多也能用

 

我最後用Counter過了(測資#3 0.4s)(研究了好久,畢竟跟字典不太熟,Counter更是陌生)

不過真的超級感謝你花時間幫我看程式碼,太謝謝你了

 
#44286: Re: python TLE求救


hansjiang1017@gmail.com (單純想出題所以在拚30%)

學校 : 不指定學校
編號 : 278037
來源 : [111.242.102.214]
最後登入時間 :
2024-11-12 18:30:55
b265. Q11286 - Conformity | From: [111.242.105.24] | 發表日期 : 2024-11-19 20:44

另解就是要導入額外的 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())

 
ZeroJudge Forum