百度的一道算法題

問題描述

度度熊和爺爺在玩一個乘法表遊戲。乘法表的第i行第j列位置的元素爲ij,並且乘法表下標編號從1開始,比如2 × 3乘法表爲
1 2 3
2 4 6
爺爺十分聰明,對於n
m的乘法表,只要度度熊給出一個數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;
      }
}

這是第一次接觸,發現真的,不容易。
自己在算法這一塊還是有很大的漏洞,有差距啊!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章