这题是二叉树分类的题目,但是看不出来怎么用二叉树解答,有人说用线段树,但是线段树还不会。
归纳一下,大概2种方式解答:
1.STL解答
首先介绍原型stl里面的queue类。
queue是一种容器模板,头文件#include< queue >可以使用queue类。
queue<Type, Container> (<数据类型,容器类型>)
初始化时必须要有数据类型,容器可省略,省略时则默认为deque 类型
下面用一些代码简单介绍queue的使用;
1.初始化
#include<queue>
queue<int>a ;//创建一个queue类对象a,其中的数据类型是int
queue<double>b; //同理
queue<char,list<char>>c ;//数据类型为char,容器类型是list
queue<char,deque<char>>d; //用deque实现的queue
2.赋值
for(int i=0;i<10;i++) //将1-10添加进queue容器对象a
a.push(i+1);
3.删除
a.pop(); //删除队头元素
下面手写代码:
#include<iostream>
#include<queue>
#include<map>
queue<pair<int,int>> qu; //pair应该也是应该模板,结构体模板,
int main()
{
int n;
int country;
int num=0; //记录是第几个国家
cin>>n;
n=1<<n; //2的n次方
for(int i=1;i<=n;i++)
{
cin>>country1
qu(make_pair(country,i));
}
while(qu.size()!=2) //一直到等只有2个国家的时候退出循环
{
pair<int, int> x, y;
x = q.front();
q.pop();
y = q.front();
q.pop();
if (x.second > y.second) { //从队头取出两个队,进行比较后将较强的队压入队尾
q.push(x);
}
else {
q.push(y);
}
}
pair<int, int> x, y; //最后处理两个国家
x = q.front();
q.pop();
y = q.front();
q.pop();
if (x.second > y.second) { //较弱的那队时亚军,将其国家号输出
cout << y.first << endl;
}
else {
cout << x.first << endl;
}
}
2.快速排序
由于最后看到是两个国家比拼,那么把所有编号分成两份,左右各一半,左边的冠军和右边的冠军进行最后的决战争出冠军,亚军。再一个可以知道,一个区间编号的冠军一定是这个区间中最大的编号。那么,将两个区间进行快速排序,得到两个最大值,这两个最大值就是冠,亚军。
#include<bits/stdc++.h>
using namespace std;
int tmp,n,tmp2,p,ans;
struct cou{
int en;//每个国家的能量值
int ta;//每个国家的编号
}a[200];
bool cmp(cou x,cou y)
{
return x.en>y.en;//对结构体sort排序
}
int main()
{
cin>>tmp;
n=1<<n;
for(int i=1;i<=n;i++){
cin>>a[i].en;
a[i].ta=i;
}
sort(a+1,a+n/2+1,cmp);//前一部分国家排序
sort(a+n/2+1,a+n+1,cmp);//后一部分国家排序
if(a[1].en>a[n/2+1].en){
cout<<a[n/2+1].ta;//输出较小能量值的国家的编号
}
else{
cout<<a[1].ta;
}
return 0;
}