分析:第k大不好处理,第k小有一定规律。第k大就是第n*m-k+1小。二分法找寻满足条件的最小值。mid条件就是至少有k个数小于等于mid。为什么是至少有k个(而不是正好k个?),因为二维表中有相同元素,例如
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
其中12既是第14小,也是第15小。如果求第14小时,我们计算得到小于等于12的数字有15个,而小于等于11的数字只有13个,所以12能满足条件。注意此题目必须开longlong。
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll i,j,k,m,n;
int check(ll mid)/**< 计算mid 是第几小 */
{
int s=0;/**<统计每一行有多少个比mid小的数字*/
for(i=1;i<=n;i++)/**< 每一行最大值为i*m */
s+=min(m,mid/i); /**< m表示这一行所有数字都比mid小 */
return s>=k;
}
int main()
{
cin>>n>>m>>k;
k=m*n-k+1;/**< 转换成求第k小 */
ll l=1,r=m*n,mid,best;
while(l<=r)
{
mid=(l+r)/2;
if(check(mid))
best=mid,r=mid-1;
else
l=mid+1;
}
cout<<best;
return 0;
}