做了乙個noi上面的問題,叫blah集合,以a為基數,則2x+1和3x+1都在集合中,且集合中全部元素都由此計算得來。a∈[1,50],問公升序排列後第n(n∈[1,1000000])個元素是多少。以輸入示例a=1,n=100,b[n]=418為例:
集合中第乙個元素(基數)為1,1 3 4 7 10 9
2x+1: 3 7
9 15 21 19……
3x+1: 4 10
13 22 31 27……
依次計算時會發現每1個資料會變為2個,這些數又會發生交叉。題目需要得到公升序後第n個,我們如果先計算再排序一定會超時的,所以我們需要分別把2x+1和3x+1儲存起來,然後取之前儲存的較小的輸出出來,佇列很適合這項工作:
#include#includetypedef unsigned
long
long
uint64;
using
namespace
std;
uint64 blah(
intbase,int
maxid)
else
if(x2.front()else
x2.push(curval*2+1
); x3.push(curval*3+1
); curid++;
}return
curval;
}int
main()
}
不過遺憾的是,這份**超時了,雖然它在我的計算機上計算得到結果是瞬間的事情。那麼問題在哪呢?只能說可能出現在對front和pop的呼叫耗時上,當然也可能有記憶體分配方面的耗時。好吧,我們避免這些呼叫和重複的初始化——用陣列來模擬一下佇列:
#includetypedef unsignedlong
long
uint64;
using
namespace
std;
uint64 x2[
1000000],x3[1000000
];uint64 blah(
intbase,int
maxid)
else
if(x2valelse
x2[++x2cnt]=curval*2+1
; x3[++x3cnt]=curval*3+1
; curid++;
}return
curval;
}int
main()
}
這份**就以很短的時間通過了測試。
Blah數集(雙指標單調佇列)
描述 大數學家高斯小時候偶然間發現一種有趣的自然數集合blah,對於以a為基的集合ba定義如下 1 a是集合ba的基,且a是ba的第乙個元素 2 如果x在集合ba中,則2x 1和3x 1也都在集合ba中 3 沒有其他元素在集合ba中了。現在小高斯想知道如果將集合ba中元素按照公升序排列,第n個元素會...
Java集合之佇列
jdk兩套佇列 為什麼要使用阻塞佇列?消費者和生產者不會保持相同的速度,如生產者快時候,佇列會越來越大,相比之下,阻塞佇列只允許生產者的速度在一定速度上超過消費者的速度,但不會超過很多。linkedblockingqueue 基於鍊錶的無界阻塞佇列,但也可以指定長度,不指定無界,內部維護了乙個鍊錶快...
C 基礎之 集合 佇列
佇列是其元素以先進先出 fifo 的方式來處理的集合。先放在佇列中 的元素會先讀取。佇列的例子有在機場排的隊 人力資源部中等待處理求職信的佇列 列印佇列中等待處理的列印任務 以迴圈方式等 處理的執行緒。另外,還常常 有元素根據其優先順序來處理的佇列。例如,在機場的佇列中,商務艙乘客的處理要優先於經濟...