#include<stdio.h>
int d, b[100005];
int max(int x, int y)
{
if (x > y) return x;
else return y;
}
int main()
{
int n, l;
scanf("%d %d", &n, &l);
int t = 1;
if (l > n) l = n;//每篇最多引用一次
for (int i = 1; i <= n; i++)
{
scanf("%d", &d);
b[d]++;//b[d]记录被引用次数
t = max(t, d);//记录最大被引用次数
//不用记录最大被引用次数
//虽然可能存在t>n,但是要求至少h篇论文的被引用次数不少于h,因此讨论论文被引用次数>n的情况没有意义
//还是需要计算的。。。。因为采用的数组b[i]储存被引用次数大于i时的论文数
//可以用if(d > n) k++,用k储存被引用次数大于n的论文数
};
//t = max(t, n);
//若用k储存,则需要b[n] += k;
for (int i = t; i >= 0; i--)//b[i]表示被引用次数大于i的文章数目
b[i] = b[i] + b[i + 1];
//printf("%d", b[0]);
/*printf("%d", t);
for (int i = 0; i <= n; i++)
printf("%d", b[i]);*/
//printf("%d %d %d %d\n", b[50], b[51], b[52], b[53], b[54]);
/*printf("%d\n", t);
printf("%d", b[3]);*/
for (int i = n; i >= 0; i--)
{
if ((b[i - 1] >= i)&& (b[i] + l >= i))
{
printf("%d", i);
return 0;
}
//在再次引用l次后,达到要求(i),通过计算可以发现
//原被引用次数+h,要与i相等,其次,需要有i-l篇论文已经篇论文被引用了大于i-l次
// 这里要求b[i-1]达到大于i的要求,因为每个只能引用一次,如果是b[i-l]则会出现被引用多次的可能性
}
}
03-17
404
03-20
400