その曲がii
回再生されたが、Zipf の法則ではi回再生されたであろうと予測されているとします。次に、曲の品質をi = i / iと
定義します。ソフトウェアは、iの値が最も高い曲を選択する必要があります。f
z
i
q
f
z
q
入力の最初の行には、2 つの整数n
とm
( 1 <= n < 50 000
, 1 <= m <= n
)、アルバムの曲数、および選択する曲数が含まれます。次に、n
行に従います。これらの行のi
'th には、整数f
iと文字列s
iが含まれます。ここで、0 <= f
iは'th の曲が聴かれ< 10^12
た回数であり、 iは曲の名前です。各曲名の長さは最大 30 文字で、文字、、およびアンダースコア ( ) のみで構成されます。i
s
a-z
0-9
_
最高の品質q
iを持つ m 曲のリストを、品質の降順で出力します。2 つの曲が同じ品質である場合は、アルバムの最初に表示されている曲を優先します (おそらく、プロデューサーがその曲を他の曲よりも前に置く理由があったと思われます)。
sample input
4 2
30 one
30 two
15 three
25 four
sample output
four
two
私はPythonにかなり慣れていないので、このパズルを解こうとしています。正しい答えを得ていると思いますが、もっと速くやらなければなりません。何か推奨事項はありますか?
from __future__ import division
def main():
import sys
from operator import itemgetter
data = sys.stdin.readlines()
line1 = data[0].split(" ")
numberofselect = line1[1]
qualitydict = {};
songdict = {};
a = 0
for x in range(1, len(data)):
item = data[x].split(" ");
item1 = item[1].split("\n");
f = float(item[0])
z = float(1/x)
qualitydict[item1[0]] = (f/z)
if ((f/z) in songdict.keys()):
songdict[(f/z)].append(item1[0])
else:
songdict[(f/z)] = [item1[0]]
items = songdict.items()
items.sort(key = itemgetter(0), reverse=True)
for key, value in items:
for element in value:
if (a < int(numberofselect)):
print element
a = a + 1
main();