题目
由于对计算机科学的热爱,以及有朝一日成为 「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 的行为。
输入格式
输入的第一行包含 N和 L。
第二行包含 N个空格分隔的整数 c1,…,cN。
输出格式
输出写完综述后 Bessie 可以达到的最大 h指数。
数据范围
1≤N≤105
0≤ci≤105
0≤L≤105
- 输入样例1:
4 0
1 100 2 3
- 输出样例1:
2
样例1解释
Bessie 不能引用任何她曾经写过的论文。上文中提到,(1,100,2,3)的 h指数为 2。
- 输入样例2:
4 1
1 100 2 3
- 输出样例2:
3
样例2解释
如果 Bessie 引用她的第三篇论文,引用数会变为 (1,100,3,3)。上文中提到,这一引用数的 h指数为 3。
题解
import java.util.Arrays;
import java.util.Scanner;
/**
* @author akuya
* @create 2024-03-05-15:01
*/
public class Main {
static int N=100010;
static int n,l;
static int a[]=new int[N];
static int res=0;
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
n=scanner.nextInt();
l=scanner.nextInt();
for(int i=1;i<=n;i++){
a[i]=scanner.nextInt();
}
Arrays.sort(a,1,n+1);
//因为数的总量为n,所以h指标小于等于n,遍历1-n。
for(int i=1,j=1;i<=n;i++){
//找到第一个大于等于i的数,此时满足h指标
while(a[j]<i&&j<=n)j++;
//条件判断
if(n-j+1>=i-l){
if(n-j+1<i){
int t=i-(n-j+1);
if(a[j-t]>=i-1)res=i;
}else{
res=i;
}
}
}
System.out.println(res);
}
}
思路
这道题运用了遍历和双指针,一个指针用于遍历,另一个指针作为条件的判断,其中j为指向第一个大于等于遍历h指标的数,再通过判断条件,大于其h指标的数是否够,够则满足条件,为备选答案。