首页 > 试题广场 >

#includeusing&nb...

[单选题]
下面代码输出结果是()
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}

struct stsort {
    bool operator () (const int a, const int b) const {
        if (gcd(30, a) < gcd(30, b)) {
            return 1;
        }
        else if (gcd(30, a) == gcd(30, b)) {
            return a < b;
        }
        else return 0;
    }
};

int main() {
    int n = 5;
    priority_queue<int, vector<int>, stsort>q;
    for (int i = 1; i <= n; ++i) {
        q.push(i);
    }
    for (int i = 1; i <= n; ++i) {
        printf("%d", q.top());
        q.pop();
    }
    return 0;
}

  • 53421
  • 53241
  • 12435
  • 14235
priority_queue的stsort比较类的比较函数,通过分析发现,***(30, a) < ***(30, b) return 1 表明这类情况不合适(这个规则是通过观察正常的优先队列得出的),应该b在a前,所以是‘降序’。
其次***函数的功能不用去探究,直接把1-5带入***(30, 1-5)得结果就行.
***(30, 1) = 1; ***(30, 2) = 2, ***(30, 3) = 3, ***(30, 4) = 2, ***(30,5) = 5
5 > 3 > 2 = 2 > 1; (ps:stsort有相等的情况下的比较,也是降序)
5 3 4 2 1
编辑于 2020-09-23 11:26:35 回复(0)
在楼下Ricardo•S•伦的基础上,补充。优先队列是 先进先出,但是先出的是优先级比较高的元素。在每次push的时,系统会比较 即将push进去的元素和 队列中的元素的优先级,并且将优先级较高的放在,队首(以便第一个出队)。stsort()定义了一个优先级大小比较规则,按照Ricardo•S•伦的理解,return 0 代表 a的优先级大于b。故优先级为 1<2<4<3<5 .因此push完后,队列中的顺序是 53421。故出队列的顺序也就是53421。
发表于 2020-08-27 21:54:36 回复(0)
*** 最大公约数
发表于 2020-10-26 09:54:46 回复(0)
priority_queue为优先队列,每次push队内会重新按优先级排列,优先级排列比较方式为stsort(a,b),返回0表示排列正确,如stsort(4,3)返回1,所以3应该排在4前面,stsort(4,2)为0
发表于 2020-08-24 11:26:01 回复(0)
发表于 2022-06-10 17:44:31 回复(0)
官方解析是照着B写的。。。
编辑于 2024-03-02 14:16:06 回复(0)
360的题就没做对过
发表于 2022-07-30 16:54:08 回复(0)
<p>应该是按数字中的bit位多少和数字的大小从大到小输出</p>
发表于 2020-08-09 00:03:04 回复(0)
着题蒙对了,还想来看看解析呢,结果一个人都没得!!!
发表于 2020-08-07 15:48:25 回复(0)