侧边栏壁纸
博主头像
Hope博主等级

努力赚钱的工科研究生

  • 累计撰写 362 篇文章
  • 累计创建 129 个标签
  • 累计收到 5 条评论
标签搜索

Acwing 春季每日一题 3745. 牛的学术圈 I

Hope
2022-03-20 / 0 评论 / 0 点赞 / 367 阅读 / 785 字
温馨提示:
本文最后更新于 2022-03-20,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Acwing 春季每日一题 3745. 牛的学术圈 I

思路:

首先说明一下什么是h指数,就是对于给定的一个论文引用数,如果在这一堆引用数中,有h个数的大小大于等于h,剩余的 l - h个数都严格小于h,就得到了h指数,h指数可能不唯一。

这道题就是在不满足的数上可以操作一次 + 1,这样我们可以枚举h的长度,同时如果我们对数组进行降序排序,然后在h这么长下,找到第一个大于等于h的数,然后在这个数的后面一直到第h个数,如果每个数都满足大于等于h - 1,而且这个长度还小于给定的L,那么我们就可以去更新这个区间,同时我们可以发现,如果要求所有的数都是大于等于h - 1,只需要满足最后一个数a[i] 是大于等于 i - 1的就可以了,如果这个数不满足,那么 + 1是不会满足h指数的条件的,同时可以发现,对于每次h的增长,第一个大于等于h的数一定是在后移的,所以我们可以使用双指针算法。

image.png

代码:

#include<iostream>
#include<algorithm>
using namespace std;

const int N = 1e5+10;
int a[N];
int n,L;

int main(){
    cin>>n>>L;
    for(int i = 1; i <= n; i++) cin>>a[i];
    
    sort(a + 1,a + n + 1,greater<int>());
    int res = 0;
    //找到第一个大于h的数 然后看 这个数到h这一段的个数是不是小于L 如果是就更新res
    //同时判断a[i - 1] 这个数是不是小于等于 h - 1的
    for(int i = 1,j = n;i <= n;i++){
        while(j && a[j] < i) j--;
        if(i - j <= L && a[i] >= i - 1) res = i;
        
    }
    cout<<res;
    return 0;
}

0

评论区