列表

详情


BD15. 序列合并

描述

其中系数aj都是整数满足0≤aj1000且至少有两个系数严格大于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;
}

上一题