NC14301-K-th Number

K-th Number

https://ac.nowcoder.com/acm/problem/14301

知识点:二分,尺取
题意:给定长度为n的数组,求其中所有长度大于k的区间第k大的数中第m大的数。
思路:二分答案x,尺取法判断第K大的数大于等于x的区间数,如果该区间数大于等于m,则answer>=x。
代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
int a[N],n,k;
ll m;
void read()
{
    cin>>n>>k>>m;
    for(int i=0;i<n;i++) scanf("%d",a+i);
}
bool check(int x)    //尺取
{
    int num=0;
    ll s=0;
    for(int i=0,j=0;j<n;j++){
        if(a[j]>=x) num++;
        if(num==k){
            s+=n-j;
            while(a[i]<x) s+=n-j,i++;
            num--;i++;
        }
    }
    if(s>=m) return true;
    return false;
}
void slove()     //二分
{
    int l=1,r=1e9+10,mid;
    while(l<r){
        mid=(l+r)>>1;
        if(check(mid)) l=mid+1;
        else r=mid;
    }
    cout<<l-1<<endl;
}
int main()
{
    int T;
    cin>>T;
    while(T--){
        read();
        slove();
    }
    return 0;
}
全部评论
直击要点 简单明了 赞
点赞 回复 分享
发布于 2020-04-22 22:23

相关推荐

给🐭🐭个面试机会吧:我boss直聘天天有家教跟我打招呼😓
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务