二分题,不过一开始看这道题真没想到二分,还是看了题解才知道的。。。
注意,本题的第k大数字实际上是把矩阵中的数字按升序排列后的第k个数字。
在区间1~n*m里进行二分,对每一个mid利用min(m,mid/i)得到矩阵第i行不比mid大的数字个数,将每一行的结果累加起来得到ret,则mid是第ret大的数字,接着根据ret与k的大小继续二分,直到l>=r时,r就是所求值。
不过我有些不明白的是,为什么二分的结果能保证是矩阵中的数字。。。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <stdio.h>
using namespace std;
typedef long long ll;
long long n,m,k;
int main()
{
int i,j;
while(~scanf("%I64d%I64d%I64d",&n,&m,&k)) {
ll l=1,r=n*m;
while(l<r) {
ll mid=(r-l)/2+l;
ll t=0;
for (i=1;i<=n;i++) {
t+=min(m,mid/i);
}
if (k<=t) r=mid;
else l=mid+1;
}
printf("%I64d\n",r);
}
}