P4715 【深基16.例1】淘汰赛
P4715 【深基16.例1】淘汰赛
题目描述
有 2^n(n≤7) 个国家参加世界杯决赛圈且进入淘汰赛环节。我经知道各个国家的能力值,且都不相等。能力值高的国家和能力值低的国家踢比赛时高者获胜。1 号国家和 2 号国家踢一场比赛,胜者晋级。3 号国家和 4 号国家也踢一场,胜者晋级……晋级后的国家用相同的方法继续完成赛程,直到决出冠军。给出各个国家的能力值,请问亚军是哪个国家?
输入格式
无
输出格式
无
输入输出样例
输入
3
4 2 3 1 10 5 9 7
输出
1
思路1
把 nn 支队伍分成两个区间,一个上半区,一个下半区。
那么上半区最强者与下半区最强者,必是一冠一亚。
直接 sort 即可
代码
#include <bits/stdc++.h>
using namespace std;
int n;
struct dui{
int a,num;
}dd[1000];
bool cmp(dui a,dui b)
{return a.a<b.a;}
int main()
{
scanf("%d",&n);
for(int i=1;i<=(1<<n);i++)
scanf("%d",&dd[i].a),dd[i].num=i;
sort(dd+1,dd+(1<<n)/2+1,cmp);
sort(dd+(1<<n)/2+1,dd+(1<<n)+1,cmp);
printf("%d",dd[(1<<n)/2].a<dd[(1<<n)].a?dd[(1<<n)/2].num:dd[(1<<n)].num);
return 0;
}
思路2
我们可以用队列来对此进行存储,把每个国家的信息全部输进队列当中存储,每一次弹出两个对此进行处理,最后赢得值又插入队列的尾部,一直处理到只剩两个元素的时候,输出小的那一个,但是题目的要求要我们求第几个国家我们开始可以用map对此进行映射,直接输出映射的结果,我们还可以用for对所有国家进行查找,找到的相对应的值就是我们的答案(因为题目说了每个国家的能力值一定不相同,所以我们有唯一的国家与我们的能力值相对应的)
建议要用map来映射,如果题目没说每个国家的能力值一定不相同的话,就会出问题。(如果有两个国家能力值相同的话,就不知道答案到底是哪一个国家了),map就不会出现这种问题,map是将答案和我们的能力值一一对应,找到正确的能力值就直接对应了正确的答案了
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
queue<int>q;
int n;
cin>>n;
int nn=pow(2,n);
int a[nn+1];
for(int i=1;i<=nn;i++){
cin>>a[i];
q.push(a[i]);
}
int vis1,vis2;
while(q.size()!=2){
vis1=q.front();
q.pop();
vis2=q.front();
q.pop();
if(vis1>vis2){
q.push(vis1);
}
else{
q.push(vis2);
}
}
vis1=q.front();
q.pop();
vis2=q.front();
q.pop();
if(vis1>vis2){
q.push(vis2);
}
else{
q.push(vis1);
}
for(int i=1;i<=nn;i++){
if(a[i]==q.front()){
cout<<i;
return 0;
}
}
}
浙公网安备 33010602011771号