问题描述
度度熊和爷爷在玩一个乘法表游戏。乘法表的第i行第j列位置的元素为ij,并且乘法表下标编号从1开始,比如2 × 3乘法表为
1 2 3
2 4 6
爷爷十分聪明,对于nm的乘法表,只要度度熊给出一个数k,爷爷就能立刻告诉度度熊乘法表中元素按照不减顺序排列之后,第k个元素是多少。你能重复这个游戏吗?
解题思路
首先,平常的思路是,排序,输出第k个元素。
但是这道题那样做就会超时,且空间也会不够用。
正解是,二分法
import java.util.Scanner;
public class Main{
public static void main(String[] args){
// 输入
Scanner in = new Scanner(System.in);
long n = in.nextLong();
long m = in.nextLong();
long k = in.nextLong();
// 左计数器
long l = 0;
// 右计数器
long r = n*m;
// 中间计数器
long mid;
// 二分法
while(l<=r){
// 计算出中间计数器
mid = (l+r)/2;
// 如果左边集合元素个数小于k,
// 因为是不减序列,第k个值一定在右边序列
if(sum(mid,n,m)<k){
l=mid+1;
}else{
r=mid-1;
}
}
System.out.println(l);
}
static long sum(long c , long n, long m){
long sum = 0;
// 妙!!
for (int i=1;i<=n;i++){
sum+=(c>=m*i)?m:c/i;
}
return sum;
}
}
这是第一次接触,发现真的,不容易。
自己在算法这一块还是有很大的漏洞,有差距啊!!