4kyu N linear
生活随笔
收集整理的這篇文章主要介紹了
4kyu N linear
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
4kyu N linear
題目背景:
Task
Consider an integer sequence U(m) defined as:
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4kyu Twice linear
- 下一篇: 有跳板机时,如何使用sshfs挂载远程服