题目描述
有 2n(n≤7)个国家参加世界杯决赛圈且进入淘汰赛环节。已经知道各个国家的能力值,且都不相等。能力值高的国家和能力值低的国家踢比赛时高者获胜。1 号国家和 2 号国家踢一场比赛,胜者晋级。3 号国家和 4 号国家也踢一场,胜者晋级……晋级后的国家用相同的方法继续完成赛程,直到决出冠军。给出各个国家的能力值,请问亚军是哪个国家?
输入格式
第一行一个整数 n,表示一共 2n 个国家参赛。
第二行 2^n 个整数,第 i 个整数表示编号为 i 的国家的能力值(1≤i≤2^n)。
数据保证不存在平局。
输出格式
仅一个整数,表示亚军国家的编号。
输入输出样例
输入 #1复制
3 4 2 3 1 10 5 9 7输出 #1复制
1
代码:
1. 无难点
#include <bits/stdc++.h>
using namespace std;
int n,maxn1,d1,maxn2,d2;
int sn[210];
int main(){
scanf("%d",&n);
for(int i = 1;i<=pow(2,n);i++) cin >> sn[i];
for(int i = 1;i<=pow(2,n-1);i++){
if(sn[i]>maxn1){
maxn1=sn[i];
d1=i;
}
}//找到前一半的最大值
for(int i = pow(2,n-1)+1;i<=pow(2,n);i++){
if(sn[i]>maxn2){
maxn2=sn[i];
d2=i;
}
}//找到后一半的最大值
if(maxn1>maxn2) cout << d2;//如果前一半的最大值大于后一半的最大值,那么亚军是后一半最大值对应的国家
else cout << d1;
return 0;
}
2. 结构体
#include <bits/stdc++.h>
using namespace std;
int n;
struct gj{
int id,nl;
}sn[210];
bool cmp(gj x,gj y){
return x.nl>y.nl;
}
//pow(a,b) a的b次方
int main(){
cin >> n;
for(int i = 1;i<=pow(2,n);i++){
sn[i].id=i;
cin >> sn[i].nl;
}
int xx=pow(2,n-1);
sort(sn+1,sn+xx+1,cmp);
//注意sort(sn+pos1,sn+pos2)是从pos1开始到pos2-1排序
sort(sn+xx+1,sn+xx*2+1,cmp);
if(sn[1].nl<sn[xx+1].nl) cout << sn[1].id;
else cout << sn[xx+1].id;
return 0;
}