3 条题解
-
7
题目: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)); }
但要注意,题目要求的是亚军(第二名),所以循环结束后不应输出 的队首元素。
因为循环中 起到缓存当前遍历的两个国家的作用,所以 中现在存储的是冠军和亚军,那么应该输出 中的较小值。
我们可以看到,代码中调用了对于
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
- 上传者