Blah數集-構造法
阿新 • • 發佈:2019-03-22
int 有趣 高斯 stl main ret 自然 數學家 隊列
問題描述:
大數學家高斯小時候偶然間發現一種有趣的自然數集合Blah,對於以a為基的集合Ba定義如下:
(1) a是集合Ba的基,且a是Ba的第一個元素;
(2)如果x在集合Ba中,則2x+1和3x+1也都在集合Ba中;
(3)沒有其他元素在集合Ba中了。
現在小高斯想知道如果將集合Ba中元素按照升序排列,第N個元素會是多少?
AC代碼
LL Ba[1000010]; int main() { int a,n; while(cin >> a >> n) { Ba[1] = a; int x = 1,y = 1;// 輪到哪個元素"上"了 for(int i = 2; i <= n; ++i) { Ba[i] = min(Ba[x] * 2 + 1, Ba[y] * 3 + 1);// 取較小 if(Ba[i] == Ba[x] * 2 + 1) x++; if(Ba[i] == Ba[y] * 3 + 1) y++; } cout << Ba[n] << endl; } return 0; }
算法描述:
本題與H數可謂是一模一樣,代碼也一模一樣.
集合是具有互異性的,不能存在重復的元素.
同H數,每個元素都有機會去構造集合的下一個元素.
題面的特征是要求構造由給定規則生成的單調序列.
STL set正可以保證單調性和互異性.
STL 優先隊列不能保證互異性.
Blah數集-構造法