Skip to content

פתרון לXplore

מה רוצים בתרגיל

הגדרה של דרגת H:נקבעת לפי המספר המקסימאלי שיש עבורו כמות השווה לערך שלו של מספרים גדולים או שווים ממנו
לדוגמא,9, 9, 9, 6, 5, 4, 4 לא יכול להיות 6 או 9 כי אין 6 או 9 מספרים הגדולים או שווים ל6 או 9 וגם לא יכול להיות 4 כיוון ש5 זה המספר המקסימאלי שיש עבורו 5 מספרים
הגדולים או שווים לו.
לכן הדרגה של המערך הזה יהיה 5.
מקבלים קובץ JSON,בכל שורה מופיע מאמר,אנשים שכתבו את המאמר וכמות הפעמים שהוא מוזכר.
צריך להוציא מהקובץ את כל הסופרים שכתבו את המאמרים ולהדפיס אותם אחד אחרי השני בהתאם לדרגת ה-H של כל סופר.
במידה ול2 סופרים יש את אותה דרגה צריך להדפיס אותם לפי הא'ב'.

איך פותרים

ניצור מערך שיכיל את השמות של הסופרים וdictionary שהמפתח שלו יכיל את השם של הסופר והערך יכיל מערך של כמות הפעמים שהוא מוזכר בכל מאמר שהוא השתתף.

for index in range(n):
    data = json.loads(input())
    for author in data['authors']['authors']:
        if author['full_name'] not in names:
            dic[author['full_name']] = [data['citing_paper_count']]
            names.append(author['full_name'])
        else:
            dic[author['full_name']].append(data['citing_paper_count'])

אחרי שיצרנו את 2 המערכים האלה,נרוץ בלולאת for על המערך של השמות וכל פעם נקח שם ובהתאם לזה ניגש למפתח של הdictionary וכך נגיע למערך של כל שם.
מציאת דרגת H של כל סופר:נמיין את המערך מהסוף להתחלה כך שהאיבר הגדול ביותר נמצא במקום הראשון.
כל פעם נבדוק אם האיבר שנמצא במקום ה[i] קטן מi+1 במידה והוא קטן הדרגה תהיה i במידה ולא נתקדם לאיבר הבא(i+1). אם סיימנו לבדוק את כל האיברים במערך ולא מצאנו כלום דרגת המערך שווה לגודל המערך.
נכניס לתוך dictionary חדש את כל השמות של הסופרים עם הדרגות שלהם ונמיין אותם בסדר יורד לפי דרגה ובסדר עולה לפי א'ב' ונדפיס אותם אחד אחד

answer = {}
for name in names:
    x = sorted(dic[name],reverse=True)
    leng  = len(x)
    answer[name] = -1
    for j in range(leng):
        if x[j] < j +1:
            answer[name] = j
            break
    if answer[name] == -1:
        answer[name] = leng