Сүйікті оқушы


Шешімді жөнелту

Ұпайлар: 1
Уақыт шектеуі: 1.0s
Жад шектеуі: 256M

Author:
Problem type

Спорттық бағдарламалау әлемінде әдетте екі форматтағы жарыстарды ажыратады: IOI (International Olympiad in Informatics) және ICPC (International Collegiate Programming Contest). Мысалы, «ЧРК» жарысы ICPC ережелері бойынша өткізіледі.

  1. ICPC форматы:

    • Жарысқа бірнеше адамнан тұратын командалар қатысады.

    • Барлық есептер бірдей бағаланады (есеп не шешілген, не шешілмеген).

    • Мақсат — шектеулі уақыт ішінде барынша көп есепті шешу.

    • Шешілген есептердің саны бірдей болған жағдайда, жазасы (айып уақыты) аз команда жоғары орынға ие болады (дұрыс шешім үшін — контест басталған сәттен бастап саналған минуттар саны + әрбір қате жіберу үшін 20 минут айыппұл).

  2. IOI форматы:

    • Әрбір қатысушы жеке өнер көрсетеді.

    • Әр есеп 100 баллмен бағаланады, жартылай шешімдер үшін аралық балл алуға болады (мысалы, 30, 70 балл және т.б.).

    • Қатысушының қорытынды нәтижесі — әр есеп бойынша алған ең жоғары (максималды) ұпайлардың жиынтығы (есепте барлық жіберілген шешімдер ішінен тек ең үздік нәтиже ескеріледі).

    • Жалпы ұпайлары тең болған қатысушылар сол орынды бөліседі.

Мысалы, бір оқу-жаттығу IOI-жарысына N адам қатыссын, олардың нөмірлері 1-ден n-ге дейін, ал сіздің нөміріңіз — 1. Жаттықтырушыңыз сізді бірінші орынға шығарғысы келеді, өйткені ол сізді ерекше жақсы көреді. Осы мақсатқа жету үшін жаттықтырушы қалаған қатысушының (қаласа — сіздің де) белгілі бір есеп бойынша барлық жіберілімдерін «ескермеуге» (толығымен жоюға) болады, сол жіберілімдер ешқашан болмағандай саналады. Бұл әрекет таңдалған қатысушы мен есеп үшін бір батырманы басу арқылы орындалады.

Жойылған шешімдер қайта есептеу кезінде ескерілмейді.

Сіздің қорытынды ұпайыңыз кез келген өзге қатысушының ұпайынан кем болмас үшін, батырманы неше рет ең аз басу керек?

Енгізу

Бірінші жолда n және q сандары беріледі (2n100,1q1000) — қатысушылар саны және жіберілімдер (посылок) саны.

Келесі q жолдың әрқайсысында 3 элемент (токен) бар: id, Prob, score (1idn, `A'Prob`F', 1score100). Бұл «Қатысушы id Prob есебі үшін score ұпай алғанын» білдіреді. Әрбір есеп 'A'-дан 'F'-ке дейінгі бас әріппен белгіленеді.

Шығару

Жалғыз санды шығарыңыз — сіз бірінші орынға шығу үшін ескермеуге (жоюға) қажет ең аз жіберілімдердің (посылок) санын көрсетіңіз.

Мысалдар

Енгізу 1
Көшіру
5 11
1 F 22
1 E 66
2 E 73
2 B 35
2 F 88
3 A 14
3 C 24
3 E 71
3 E 36
5 B 49
4 A 88
Жауап 1
Көшіру
3

Ескертпелер

Егер осылай жоюлардан кейін сізде және қарсыласыңызда тең ұпайлар қалатын болса, екеуіңіз де бірінші орынды бөлісесіздер, және бұл ресми түрде «жеңімпаз» болып саналу үшін жеткілікті.

Бірінші тесттік мысалда: 1-ші қатысушыда — 88 ұпай, 2-ші қатысушыда — 196 ұпай, 3-ші қатысушыда — 14+24+71=109 ұпай, 4-ші қатысушыда — 88 ұпай, 5-ші қатысушыда — 49 ұпай. 3-ші қатысушының «C» есебін ескермеуге (жоюға), сондай-ақ 2-ші қатысушының «E» және «B» есептерін ескермеуге болады.


Пікірлер


  • 0
    85shynar85  commented 64 days ago

    from collections import defaultdict

    def min_deletions_to_win(N, M, submissions, my_id):

    Көшіру
    # Қатысушылардың ең жақсы нәтижелерін сақтау
    best_scores = defaultdict(lambda: defaultdict(int))
    
    # Әр есептің әр қатысушы үшін ең жоғары ұпайын табу
    for participant, problem, score in submissions:
        best_scores[participant][problem] = max(best_scores[participant][problem], score)
    
    # Әр қатысушының жалпы ұпайларын есептеу
    total_scores = {p: sum(scores.values()) for p, scores in best_scores.items()}
    my_score = total_scores[my_id]
    
    # Бізден жоғары тұрған қатысушыларды анықтау
    higher_participants = [(p, total_scores[p]) for p in total_scores if total_scores[p] > my_score]
    
    # Егер ешкім бізден жоғары болмаса, 0 қайтарылады
    if not higher_participants:
        return 0
    
    # (Ұпай айырмашылығы, есеп бойынша жіберілімдер) түрінде сақтаймыз
    deletions = []
    for p, score in higher_participants:
        diff = score - my_score  # Айырмашылық
        problem_scores = sorted(best_scores[p].values(), reverse=True)  # Үлкен ұпайларды бірінші жоямыз
        removed = 0
        for s in problem_scores:
            diff -= s
            removed += 1
            if diff <= 0:
                deletions.append(removed)
                break
    
    return min(deletions)  # Ең аз жоюлар саны

    Енгізу

    N, M = map(int, input().split()) submissions = [input().split() for _ in range(M)] submissions = [(int(p), prob, int(s)) for p, prob, s in submissions] my_id = 1 # Сіздің қатысушы нөміріңіз

    Жауапты шығару

    print(min_deletions_to_win(N, M, submissions, my_id))