3745. 牛的学术圈 I

摘要
Title: 3745. 牛的学术圈 I
Tag: 二分
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

3745. 牛的学术圈 I

  • 题意

    由于对计算机科学的热爱,以及有朝一日成为 「Bessie 博士」的诱惑,奶牛 Bessie 开始攻读计算机科学博士学位。
    经过一段时间的学术研究,她已经发表了 N 篇论文,并且她的第 i 篇论文得到了来自其他研究文献的 ci 次引用。
    Bessie 听说学术成就可以用 h 指数来衡量。
    h 指数等于使得研究员有至少 h 篇引用次数不少于 h 的论文的最大整数 h。
    例如,如果一名研究员有 4 篇论文,引用次数分别为 (1,100,2,3),则 h 指数为 2,然而若引用次数为 (1,100,3,3) 则 h 指数将会是 3。
    为了提升她的 h 指数,Bessie 计划写一篇综述,并引用一些她曾经写过的论文。
    由于页数限制,她至多可以在这篇综述中引用 L 篇论文,并且她只能引用每篇她的论文至多一次。
    请帮助 Bessie 求出在写完这篇综述后她可以达到的最大 h 指数。
    注意 Bessie 的导师可能会告知她纯粹为了提升 h 指数而写综述存在违反学术道德的嫌疑;我们不建议其他学者模仿 Bessie 的行为。

  • 思路

    题目相当于问,数组中 至少h个不少于h的数,问h最大多少,期间可以给每个数最多加1,一共l次机会
    将数组排序后,直接二分即可,h最小1,最大n,每次从大到小,让小于h的加1,看是否符合

  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    '''
    Author: NEFU AB-IN
    Date: 2022-03-17 10:53:36
    FilePath: \ACM\Acwing\3745.py
    LastEditTime: 2022-03-17 10:53:38
    '''


    def check(h, p):
    ans = 0
    for i in range(n - 1, -1, -1):
    if nums[i] >= h:
    ans += 1
    else:
    if p > 0 and nums[i] + 1 >= h:
    ans += 1
    p -= 1
    else:
    break
    return ans >= h


    def find():
    # 二分h
    l, r = 1, n
    while l < r:
    mid = l + r + 1 >> 1
    if check(mid, L):
    l = mid
    else:
    r = mid - 1
    return r


    n, L = map(int, input().split())
    nums = list(map(int, input().split()))

    nums.sort()

    print(find())
使用搜索:谷歌必应百度