K-th number 二分,尺取
K-th Number
http://www.nowcoder.com/questionTerminal/58debfa9e0004cf4842d05c8145918f6
题意:给Alice一个数组A[1..N]和N个数字。
现在Alice想用参数K构建一个数组B,规则如下:
最初,数组B是空的。考虑数组A中的每个间隔。如果此间隔的长度小于K,则忽略此间隔。否则,在此间隔中找到第K个最大的数字,并将该数字添加到数组B中。
事实上,Alice并不关心数组B中的每个元素。她只想知道数组B中的第M个最大元素。请帮助她查找这个数字。
知识点:二分,尺取。
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll num[100005];
ll n,k,p;
bool pd(ll m)
{
ll ct=0;
ll ans=0;
for(int r=0,l=0;r<n;r++)
{
if(num[r]>=m)
ct++;
while(l<=r && ct==k)
{
ans+=n-r;
if(num[l++]>=m)
ct--;
}
}
return ans>=p;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%lld",&n,&k,&p);
for(int i=0;i<n;i++)
{
scanf("%lld",&num[i]);
}
ll l=1,r=1e9;
while(l<=r)
{
ll m=(l+r)>>1;
if(pd(m))
l=m+1;
else
r=m-1;
}
printf("%lld\n",r);
}
return 0;
}

腾讯成长空间 1197人发布