題目描述
給你乙個n*m的矩陣,其中的元素每一行從左到右按遞增順序排序,每一列從上到下按遞增順序排序,然後給你一些數x,問這些書在不在這個矩陣中,若在,輸出其列號最大的元素座標。
輸入多組測試樣例,首先兩個數n,m(0輸出
如果存在,輸出其列號最大的元素座標
否則,輸出「no」
樣例輸入
4 4樣例輸出1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
37 8 14
3 2分析:題目說 其中的元素每一行從左到右按遞增順序排序,每一列從上到下按遞增順序排序,這一點一開始我想到了二分查詢。但為什麼每一列從上到下按遞增順序排序?之後發現二分查詢雖快,但並不使用適用此題。試聯想如果要查詢的數在最後一行的中間,那麼二分查詢也要行行遍歷才行。1000行至少要1000遍,這樣很容易因超時而掛掉。1 3no
那麼我們可以換一種思路,充分利用題目提供的條件。也是先從第一行最後乙個數開始,這個數是第一行最大的。如果要查詢的數小於該數,那麼進行左移,左移後看該數是否還小於對應位置的數,還小的繼續左移,只有這乙個方向了,下邊的數大於要查詢的的數,上邊的數則已經查詢過,肯定是小於要查詢的數的。如果一直小於,直到查詢到最左邊界還沒有結果,那麼矩陣中肯定是沒有這個數。
同理,我們如果從第一行開始要查詢的數大於最右邊的數。那麼這一行的數就不用看了因為這一行從該數開始到左邊的數都是小於該數的,直接跳到下一行繼續查詢。直到找到結果,如果最終查詢到最下邊界還沒有結果時,那麼矩陣中這個數同樣也是不存在的。
所以這樣查詢的時間複雜度為 o(n*m)(最壞情況)
還有一點需要注意的是,本題如若運用該思路,必須用c語言寫,用c++也會超時掛掉。
#includeconst int m=1e3+5;
long long map[m][m],n,m,x,i,j,k,num;
int main()
if(num==map[j][k])//如果查詢到此數,輸出對應座標結束此次查詢
else if(numelse//如果查詢數大於對應座標數,將數下移繼續查詢
}} }
}
nyoj 問題 E 紅與黑 簡單搜尋
時間限制 1 sec 記憶體限制 32 mb 提交 9 解決 8 提交 狀態 討論版 小明站在乙個矩形房間裡,這個房間的地面鋪滿了地磚,每塊地磚的顏色或是紅色或是黑色。小明一開始站在一塊黑色地磚上,並且小明從一塊地磚可以向上下左右四個方向移動到其他的地磚上,但是他不能移動到紅色地磚上,只能移動到黑色...
NYOJ 題目77 開燈問題 簡單模擬
時間限制 3000 ms 記憶體限制 65535 kb 難度 1 描述 有n盞燈,編號為1 n,第1個人把所有燈開啟,第2個人按下所有編號為2 的倍數的開關 這些燈將被關掉 第3 個人按下所有編號為3的倍數的開關 其中關掉的燈將被開啟,開著的燈將被關閉 依此類推。一共有k個人,問最後有哪些燈開著?輸...
NYOJ 題目77 開燈問題 簡單模擬
時間限制 3000 ms 記憶體限制 65535 kb 難度 1 描述有n盞燈,編號為1 n,第1個人把所有燈開啟,第2個人按下所有編號為2 的倍數的開關 這些燈將被關掉 第3 個人按下所有編號為3的倍數的開關 其中關掉的燈將被開啟,開著的燈將被關閉 依此類推。一共有k個人,問最後有哪些燈開著?輸入...