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; }
记得给五星好评哦喵~ 谢谢客官啦~
-
1
#include<bits/stdc++.h> using namespace std; int n; int value[1<<8]; int winner[1<<8]; void dfs(int x){ if(x>=(1<<n))return; dfs(2*x); dfs(2*x+1); int lvalue=value[2*x]; int rvalue=value[2*x+1]; if(lvalue>rvalue){ value[x]=lvalue; winner[x]=winner[2*x]; }else{ value[x]=rvalue; winner[x]=winner[2*x+1]; } } int main(){ cin>>n; for(int i=0;i<(1<<n);i++){ cin>>value[(1<<n)+i]; winner[(1<<n)+i]=i+1; } dfs(1); int num=(value[2]>value[3]?winner[3]:winner[2]); cout<<num; return 0; }
-
0
#include<bits/stdc++.h> 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 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;
}
- 1
信息
- ID
- 2056
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 4
- 标签
- (无)
- 递交数
- 61
- 已通过
- 29
- 上传者