思路借鉴:https://blog.youkuaiyun.com/qq_43506138/article/details/90990594 感谢大佬
对于一个长度为n的序列k=n-1,那么对于第k+1即第n个最小就是取点为区间中最大值与最小值的和出2((max+min)/2),当k小于n-1时,我们可以发现,我们想要找到区间中第k+1大的数,可以每次取一个长度为k+1的序列,那么,第k+1大的数一定出现在这个序列之中(不在这个区间里的点距离区间中(max+min)/2这个点一定更远)。
因此,我们可以在区间中每次取长度为k+1的区间,从前滚到区间结束,就可得到答案。
#include<bits/stdc++.h>
using namespace std;
long long a[300000];
int main()
{
//cout<<inf<<endl;
int t,n,flag=0,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
int ans=0;
long long minn=9999999999;
for(int i=k+1;i<=n;i++)
{
int mid=(a[i-k]+a[i])/2;
long long mx=max(mid-a[i-k],a[i]-mid);
if(mx<minn)
{
minn=mx;
ans=mid;
}
}
printf("%d\n",ans);
}
return 0;
}