题目描述
度度熊和爷爷在玩一个乘法表游戏。乘法表的第i行第j列位置的元素为i*j,并且乘法表下标编号从1开始,比如2 × 3乘法表为
1 2 3
2 4 6
爷爷十分聪明,对于n*m的乘法表,只要度度熊给出一个数k,爷爷就能立刻告诉度度熊乘法表中元素按照不减顺序排列之后,第k个元素是多少。你能重复这个游戏吗?
| 输入
输入数据是三个整数:n, m, k (1≤n, m≤5*105, 1≤k≤nm)。
| 样例输入
2 3 4
|
| 输出
输出n*m乘法表按照不减顺序排列的第k个数。
| 样例输出
3 |
#include <iostream>
using namespace std;
typedef long long int64; // int64(LL): 64位整型数, 即long long的别称
int64 m,n,k;
int64 cal(int64 x) // 计算比x小的数的个数
{
int64 sum=0;
for(int i=1;i<=n;i++)
{
sum += (m <= x/i)?m:(x/i); // min(m,x/i) 是每一行中比x小的数的个数(若i*m<=x,则会有m个数满足要求,否则会有x/i个数满足),也可以用if,else的写法 或 ? : 表达式的写法.
}
return sum;
}
int64 binarySearch(int64 leftVal, int64 rightVal, int64 kth)
{
int64 midVal;
while(leftVal <= rightVal)
{
midVal=(leftVal+rightVal)/2;
if(cal(midVal) < kth) leftVal=midVal+1; // 要找的数在后面,区间下限继续增大
else rightVal=midVal-1; // 要找的数在前面,区间上限继续减小
}
return leftVal;
}
int main()
{
while(cin>>m>>n>>k && m>=1 && n>=1 && k>=1 && k<=m*n)
{
cout<<binarySearch(1,n*m,k);
cout<<endl;
}
return 0;
}

7497

被折叠的 条评论
为什么被折叠?



