日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

4kyu N linear

發布時間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 4kyu N linear 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

4kyu N linear

題目背景:

Task
Consider an integer sequence U(m) defined as:

1. m is a given non-empty set of positive integers. 2. U(m)[0] = 1, the first number is always 1. 3. For each x in U(m), and each y in m, x * y + 1 must also be in U(m). 4. No other numbers are in U(m). 5. U(m) is sorted, with no duplicates.

Implement n_linear or nLinear: given a set of postive integers m, and an index n, find U(m)[n], the nth value in the U(m) sequence.

Example

U(2, 3) = [1, 3, 4, 7, 9, 10, 13, 15, 19, 21, 22, 27, ...] U(5, 7, 8) = [1, 6, 8, 9, 31, 41, 43, 46, 49, 57, 64, 65, 73, 156, 206, ...]

題目分析:
本道題目,是先前提到的 Twice linear的衍生版,難度上自然是提升了,如果再試圖用 Twice linear 的思路去解,顯然是行不通的。分析之前的方法,當 U(2, 3)時,用兩個隊列分別存儲 乘子為2 、 3的數據,這個問題最大的問題是為了思路簡單易懂犧牲了空間,即一股腦地把所有元素都塞進了隊列中去慢慢比較。如果說 m 中的因子彼此差距特別大,如 (2, 200, 1000)這樣會浪費了很多空間,導致內存溢出。所以本道題的思路就是去優化空間,希望不占用那么大的空間。最淺顯的思路就是打標簽,用標簽去標指每個隊列下一次填充的元素應是什么,而我的解題代碼也是按照這個思路去解決的,礙于具體思路的表述比較麻煩,我就直接奉上AC代碼:

AC代碼:

#include <queue> uint32_t n_linear(const std::set<uint32_t>& m, size_t n) {std::vector<uint32_t> m1(m.begin(), m.end());int len = m.size();std::vector<uint32_t> idx(len);std::vector<std::queue<uint32_t>> Q(len);std::vector<uint32_t> res{1};for ( int i = 0; i < m1.size(); i++ ) Q[i].push(m1[i] + 1);size_t cnt = 0;while( cnt != n ) {uint64_t min = ULLONG_MAX;for ( int i = 0; i < len; i++ ) {if ( Q[i].front() < min ) min = Q[i].front();}res.push_back(min);for ( int i = 0; i < len; i++ ) {if ( Q[i].front() == min ) {Q[i].pop();idx[i]++;Q[i].push(res[idx[i]] * m1[i] + 1);}}cnt++;}return res.back(); }

總結

以上是生活随笔為你收集整理的4kyu N linear的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。