第K大的数

来源:互联网 发布:php验证码图片不显示 编辑:程序博客网 时间:2024/04/28 06:10

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1105

这道题是我去年听说的,一次比赛悲剧的,前几天AC的,大体思路是二分答案,记住在统计的时候,复杂度为n,而不是nlogn,这道题复杂度为 nlog(MAX-MIN)

#include<stdio.h>#include<algorithm>#include<iostream>using namespace std;#define MAXN 51000__int64 a[MAXN],b[MAXN];__int64 n,k;__int64 Count(__int64 x){//统计小于等于x的个数,本题的一个易忽略点,容易写成nlogn    __int64 ret=0;    __int64 j=n-1;    for(__int64 i=0;i<n;i++){         for(;j>=0;)         if(b[j]*a[i]>x)             j--;         else break;        //printf("j=%I64d\n",j);        ret=ret+j+1;  }    return ret;}int main(){    while(scanf("%I64d%I64d",&n,&k)!=EOF){        k=n*n-k+1;        for(__int64 i=0;i<n;i++)cin>>a[i]>>b[i];        sort(a,a+n);sort(b,b+n);        __int64 low,mid,high,ans;        low=a[0]*b[0];high=a[n-1]*b[n-1];        while(low<=high){//二分答案,本题关键思路            mid=(low+high)/2;            if(Count(mid)>=k){ans=mid;high=mid-1;}            else low=mid+1;        }        printf("%I64d\n",ans);    }}



原创粉丝点击