3 条题解

  • 7
    @ 2024-7-14 22:29:51

    题目:P4715

    提交记录:R114724385

    思路:

    首先创建一个结构体 BYX 表示国家,包含两个整型变量:

    • id:国家的编号;
    • pow:power,国家的能力值。
    struct BYX{
    	int id;
    	int pow;
    };
    

    建立一个队列 queue <BYX> q; 用于存储国家。

    每次比较队首两个元素,将其中能力值较大的入队。

    while(q.size()>1){
    		a=q.front();
    		q.pop();
    		b=q.front();
    		q.pop();
    		q.push(max(a,b,cmp));
    		
    	}
    

    但要注意,题目要求的是亚军(第二名),所以循环结束后不应输出 qq 的队首元素。

    因为循环中 a,ba,b 起到缓存当前遍历的两个国家的作用,所以 a,ba,b 中现在存储的是冠军和亚军,那么应该输出 a,ba,b 中的较小值。

    我们可以看到,代码中调用了对于 BYX 结构体的排序,如果直接编译会报错。

    这是因为 BYX 结构体是我们自定义的,C++ 标准库中并无 BYX 结构体,也就没有对于 BYX 结构体的排序算法。

    所以我们需要自己写对于 BYX 结构体的排序算法吗?

    并不是。

    在这里,向大家介绍:

    cmp 函数!

    这是一个返回值为 bool 类型的函数,它的作用是返回两个参数中的较小值。

    那么我们只需要在主函数前加入对于 BYX 结构体的 cmp 函数:

    bool cmp (BYX n,BYX m){
    	return n.pow<m.pow;
    }
    

    然后代码(主体部分)就大功告成了!

    代码实现

    #include<iostream>
    #include<algorithm>
    #include<queue>
    using namespace std;
    int n;
    struct BYX{
    	int id;
    	int pow;
    }a,b;
    bool cmp (BYX n,BYX m){
    	return n.pow<m.pow;
    }
    queue <BYX> q;
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=(1<<n);i++){
    		scanf("%d",&a.pow);
    		a.id=i;
    		q.push(a);
    	}
    	while(q.size()>1){
    		a=q.front();
    		q.pop();
    		b=q.front();
    		q.pop();
    		q.push(max(a,b,cmp));
    		
    	}
    	printf("%d",min(a,b,cmp).id);
        return 0;
    }
    

    记得给五星好评哦喵~ 谢谢客官啦~

    信息

    ID
    2056
    时间
    1000ms
    内存
    125MiB
    难度
    4
    标签
    (无)
    递交数
    61
    已通过
    29
    上传者