• 1333:【例2-2】Blah数集


    【题目描述】
    大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基的集合Ba定义如下:

    (1)a是集合Ba的基,且a是Ba的第一个元素;

    (2)如果x在集合Ba中,则2x+1和3x+1也都在集合Ba中;

    (3)没有其他元素在集合Ba中了。

    现在小高斯想知道如果将集合Ba中元素按照升序排列,第N个元素会是多少?

    【输入】
    输入包括很多行,每行输入包括两个数字,集合的基a(1≤a≤50))以及所求元素序号n(1≤n≤1000000)。

    【输出】
    对于每个输入,输出集合Ba的第n个元素值。

    【输入样例】
    1 100
    28 5437
    【输出样例】
    418
    900585

    分析

    刚做这个题,有两个错误的想法,用一个vector,每次分别对队尾进行2x+1和3x+1的处理,这样循环处理,当队列满足n个元素结束队列,然后排了个序,但是这样是错误的想法,因为下一次处理仅仅对后面那个数做了处理,前面那个2x+1没有对他进行2x+1和3x+1的处理;另外一个错误想法,用了两个队列,分别去保存2x+1和3x+1的处理,但是我每次都是把队尾那个元素去作为基数,去进行3x+1或2*x+1;这样也漏了好多情况;还是没有理解到题意,自己思路也不清晰;

    1. 其实题意让获取n个元素,其中由大到小的顺序。然后我们用两个队列,分别保存2a+1和3a+1;我们把基数a动态的获取,每次取两个队列的最小值作为基数a,然后将这个最小值进行相应处理放入队列;
    2. 比如基数为1,n为8,q1的队列为3,q2的队列为4;我们可以取3作为a,出队,然后说明3在Blah集合中,相应的23+1和33+1也在,放入相应队列后,q1为7,q2队列为4,10;此时q2的队头最小,将其作为a,出队,然后说明4在Blah集合中,相应的24+1和34+1放入队列,那么q1为7,9;q2为:10,13;…
    3. 每次取集合中最小的值(没有用过的)作为基数,然后进行相应的操作;
    #include 
    
    using namespace std;
    
    
    int a, n;
    
    int main() {
        while (cin >> a >> n) {
            //因为多组数据,放在这里
            queue<int> q1, q2;
            n--;//基数算第一个元素,都没加入队列,默认已经出队一个了
    
            //每执行一次,就会出队一个最小值(出队出的都是最小值)
            while (n--) {
                q1.push(2 * a + 1);
                q2.push(3 * a + 1);
                if (q1.front() < q2.front()) {
                    //q1出队,基数变q1的队头
                    a = q1.front();
                    q1.pop();
                } else if (q1.front() > q2.front()) {
                    a = q2.front();
                    q2.pop();
                } else {
                    //相同值都出队
                    a = q1.front();
                    q1.pop();
                    q2.pop();
                }
            }
            //a就是第n个出队的元素
            cout << a << endl;
        }
        return 0;
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
  • 相关阅读:
    Mybatis-Plus之连表查询
    Intel汇编-内联汇编使用volatile
    教官保护手法基础要点
    Delphi 两种获取文件大小的方法 (支持大文件)
    kubeadm v1.20 部署K8S 集群架构
    day008
    # Sharding-JDBC从入门到精通(1)- 概述-分库分表
    世微 电动车摩托车灯 5-80V 1.2A 一切二降压恒流驱动器AP2915
    OpenHarmony 串口服务访问
    「小邓观点」SIEM解决方案的九大组件
  • 原文地址:https://blog.csdn.net/weixin_51995229/article/details/126300214