博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

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;
		}
	}
}
posted @ 2020-06-17 11:50  5656566  阅读(259)  评论(0)    收藏  举报