問題描述
度度熊和爺爺在玩一個乘法表遊戲。乘法表的第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;
}
}
這是第一次接觸,發現真的,不容易。
自己在算法這一塊還是有很大的漏洞,有差距啊!!