题解 P4715 【深基16.例1】淘汰赛
蒟蒻我又来写题解了。
看到yangrunze 大佬用线段树A的,只能%%%了
思路:
- 一串2的n次方个的数字,相邻两个互相比较,那么这串数字中最大的那个,一定是冠军。
- 但是,这道题让我们求亚军。首先要明白的一个地方是,第二大的数并不一定就是亚军,原因是它有可能与冠军比较,被刷下去了。
- 我们可以转换一下思路:把这串数字从中间一分为二。根据1.,一定可以分别求出前面和后面数字中的最大值(设为x,y),则冠军与亚军一定从x和y中取得(仔细想想,我就不解释了);然后输出亚军的编号就行了。
话不多说,上代码。亲测AC。
不要直接复制粘贴代码,根据自己的思路打一遍!!
#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=pow(2,tmp);
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;
}
祝大家AC此题。