題目鏈結
題目描述:度度熊和爺爺在玩乙個乘法表遊戲。乘法表的第i行第j列位置的元素為i*j,並且乘法表下標編號從1開始,比如2 × 3乘法表為
1 2 3
2 4 6
爺爺十分聰明,對於n*m的乘法表,只要度度熊給出乙個數k,爺爺就能立刻告訴度度熊乘法表中元素按照不減順序排列之後,第k個元素是多少。你能重複這個遊戲嗎?
這道題剛開始沒想太多,直接排序輸出,後來看了大佬的思路才發現需要使用二分法進行查詢,具體的思路就是起始的時候start = 0,ends = n*m,然後統計middle的值在其中為從小到大第幾位,如果middle > 要求查詢次數k,那麼說明middle不符號條件,在middle+1與ends之間進行查詢,如果middle 《要求查詢次數k,那麼說明下一步應該在starts與middle-1之間進行查詢,以此類推。
每次統計總次數的時候有乙個小技巧,就是通過找尋前乙個乘法表與後乙個乘法表的關係進行查詢,
比如第二行 i= 2 ,m = 4
即2 4 6 8 /2以後 就簡化為 12 3 4 ( 是連續的乙個數列)
i =3 的話 3 6 9 12 同理簡化為1 2 3 4
這時候看出來沒, 要把中間值 mid 與同行的數列比較,計算本行比其小或者相等的有幾個的話,
做法是兩邊同除以 i 那麼相當於m/i 與 1 2 3 4 比較 ,假設m = 8
原因:乘法表是呈倍數增長的,第一行為1 2 3 4,第二行為2 4 6 8為第一行的倍數,除以i之後
相等於把後面行的數字都轉換到第一行進行比較
(第一行的數字乘以i = 第i行的數字)
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
intmain()
//middle/i為一行中比middle大的數字個數,如果數字個數超出一整行時
//一整行全部取出
else
//否則只取出一整行中符合條件的數即可
}//printf("total = %d\n",total);
//每次比較的為middle,但是每次可查詢的範圍
//為[start,ends]
if(total >= k)
//total比k大的情況說明下一次查詢的範圍為[starts,middle-1]
else
if(total < k)
//total比k小的情況下說明下一次查詢的範圍為[middle+1,ends]
}printf
("%lld\n"
,start)
;//之前這裡忘記使用lld的形式輸出了,如果以%d的形式輸出會有測試點不過。
return0;
}
百度 乘法表
度度熊和爺爺在玩乙個乘法表遊戲。乘法表的第i行第j列位置的元素為i j,並且乘法表下標編號從1開始,比如2 3乘法表為 1 2 3 2 4 6 爺爺十分聰明,對於n m的乘法表,只要度度熊給出乙個數k,爺爺就能立刻告訴度度熊乘法表中元素按照不減順序排列之後,第k個元素是多少。你能重複這個遊戲嗎?輸入...
百度面試題 乘法表
這道題簡要題目如下 乘法表第i行第j列位置的元素為i j,並且乘法表下表編號從1開始,比如2 3乘法表為 1 2 3 2 4 6 那麼對於n m的乘法表按照不減順序排列之後,求第k個元素的值是多少?看到這個題,大多數同學想到的肯定是得到這個乘法表的數值,然後進行排序,從而得到k的值,這樣做的確沒問題...
百度2016實習真題 編號轉化
題目鏈結 小b最近對電子 產生了濃厚的興趣,她覺得電子 很神奇,功能遠比她想象的強大。她正在研究的是單元格的座標編號,她發現 單元一般是按列編號的,第1列編號為a,第2列為b,以此類推,第26列為z。之後是兩位字元編號的,第27列編號為aa,第28列為ab,第52列編號為az。之後則是三位 四位 五...