每日一题 4.22 K-th Number

K-th Number

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

一直没想到二分然后想正解 看了别人说才想到
那么这题就简单了 二分答案然后验证
check函数为 判断第K大的数大于等于x的区间数
面向结果编程.....

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll const  N=1e5+10;
ll n,m,k,a[N],t;

bool check(ll x)
{
    ll num=0,s=0;
    for(int i=1,j=1;j<=n;j++)
    {
        if(a[j]>=x) num++;///值大于X
        if(num==k)///出现k个值大于等于X
        {
            s+=n-j+1;///将右边界大于等于j的区间都算上
            while(a[i]<x) s+=n-j+1,i++;///左边界右移 如果num没少 又加一次右边界等于大于j的区间
            num--;i++;///这个左边界值大于X
        }
    }
    return s>=m;
}

int main()
{
    scanf("%lld",&t);
    while(t--)
    {
         scanf("%lld%lld%lld",&n,&k,&m);
         for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
         ll l=1,r=1e9,ans=0,mid;
         while(l<=r)
         {
            mid=(l+r)>>1;
            if(check(mid))ans=mid,l=mid+1;
            else  r=mid-1;
         }
         printf("%lld\n",ans);
    }
    return 0;
}

每日一题题解 文章被收录于专栏

每日一题题解的汇集

全部评论
不开long long见祖宗,擦
点赞 回复 分享
发布于 2023-08-12 23:12 湖南

相关推荐

07-20 12:08
已编辑
江南大学 图像识别
机械牛马勇闯秋招:把校园经历里面做过的项目,大作业,课设,毕设啥的,扩写,写成具体的项目经历,自我评价缩写别占篇幅,不然这简历真没东西,初筛都过不了
点赞 评论 收藏
分享
06-02 15:53
阳光学院 Java
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务