BD15. 序列合并
描述
其中系数aj都是整数满足0≤aj≤1000且至少有两个系数严格大于0,分别将n=1,n=2,n=3n...代入以上函数可以得到一个无穷长度的整数序列,即用8个系数a7,a6...a0可以唯一确定一个无穷长度的整数序列,现在给出k个通过以上方法定义的无穷序列,你需要求出将这些序列所有数字放在一起后,第n小的数字是多少?
输入描述
第一行包含一个整数k,1≤k≤104
接下来k行,每行包含8个整数a7,a6,.....a0,表示一个函数的系数,0≤aj≤1000
最后一行包含一个整数n,1≤n≤105
输出描述
输出对应的答案,保证最后的答案不超过1017
示例1
输入:
3 0 0 0 0 1 2 0 0 0 0 0 0 0 0 10 6 0 0 0 0 0 0 25 1 9
输出:
51
C++ 解法, 执行用时: 10ms, 内存消耗: 832KB, 提交时间: 2020-09-03
#include <bits/stdc++.h> using namespace std; const int N = 8; struct Node { long value; int id; }; struct cmp { bool operator()(const Node &a, const Node &b) { return a.value > b.value; } }; int compute(vector<int> &seq, int n) { long ret = seq[0]; for(int i=1; i<N; i++) { ret = ret*n + seq[i]; } return ret; } int main() { int k=0,n=0; scanf("%d",&k); vector<vector<int>> seq(k,vector<int>(N,0)); for(int i=0; i<k; i++) { for(int j=0; j<N; j++) { scanf("%d",&seq[i][j]); } } scanf("%d",&n); priority_queue<Node,vector<Node>,cmp> q; vector<int> next(k,1); long val = 0; for(int i=0; i<k; i++) { val = compute(seq[i], next[i]); q.push({val,i}); ++next[i]; } while(--n) { Node cur = q.top();q.pop(); val = compute(seq[cur.id],next[cur.id]); q.push({val,cur.id}); ++next[cur.id]; } cout << q.top().value << endl; return 0; }
C++ 解法, 执行用时: 10ms, 内存消耗: 1016KB, 提交时间: 2020-07-31
#include<bits/stdc++.h> using namespace std; const int N = 8; struct Node{ long value; int id; }; struct cmp{ bool operator()(const Node& a, const Node& b){ return a.value > b.value; } }; int compute(vector<int>& seq, int n){ //f=((((((a7*n +a6)*n +a5)*n +a4)*n +a3)*n +a2)*n +a1)*n +a0 long ret = seq[0]; for(int i=1; i<N; ++i){ ret = ret*n + seq[i]; } return ret; } int main(){ int k=0, n=0; scanf("%d", &k); vector<vector<int>> seq(k, vector<int>(N, 0)); for(int i=0; i<k; ++i){ for(int j=0; j<N; ++j){ scanf("%d", &seq[i][j]); } } scanf("%d", &n); // k路归并 priority_queue<Node, vector<Node>, cmp> q; vector<int> next(k, 1); long val = 0; for(int i=0; i<k; ++i){ val = compute(seq[i], next[i]); q.push({val, i}); ++next[i]; } while(--n){ Node cur = q.top(); q.pop(); val = compute(seq[cur.id], next[cur.id]); q.push({val, cur.id}); ++next[cur.id]; } // 第n个值 cout<< q.top().value << endl; return 0; }