P4715 【深基16.例1】淘汰赛

简介: P4715 【深基16.例1】淘汰赛

题目描述


20210502165043190.png

输入

3
4 2 3 1 10 5 9 7

输出

1


思路1:模拟+构建哈夫曼树, 当只剩下两个节点时,就是一个是冠军一个是亚军.

参考代码


#include<bits/stdc++.h>
#include<queue>
using namespace std;
typedef struct {
  int score;
  int loc;
}Node;
queue<Node> Q;
int n;
Node w1, w2;
int main() {
  cin >> n;
  int w = 1 << n;
  //cout<<w;
  for (int i = 0; i < w; i++) {
    Node node;
    cin >> node.score;
    node.loc = i + 1;
    Q.push(node);
  }
  while (Q.size() != 2) {
    w1 = Q.front();
    Q.pop();
    w2 = Q.front();
    Q.pop();
    w1.score > w2.score ? Q.push(w1) : Q.push(w2);
    //cout<<"----------------"<<endl;
  }
  w1 = Q.front();
  Q.pop();
  w2 = Q.front();
  Q.pop();
  if (w1.score > w2.score) {
    cout << w2.loc << endl;
  }
  else {
    cout << w1.loc << endl;
  }
  return 0;
}

思路2:可以把串分成前后两部分,前半部分的最高分和后半部分的最高分进行比较,胜利的便为冠军,失败的为亚军.

参考代码

#include<bits/stdc++.h>
using namespace std;
typedef struct {
  int score;
  int loc;//位置
} Node;
bool cmp(Node x,Node y) {
  return x.score<y.score;
}
Node arr[(1<<7)+10];
int n,num;
int main() {
  cin>>n;
  num = 1<<n;
  for(int i = 1; i <= num; i++) {
    cin>>arr[i].score;
    arr[i].loc = i;
  } 
  sort(arr+1,arr+num/2+1,cmp);//arr,arr+n  0  4
  sort(arr+num/2+1,arr+num+1,cmp);//arr 0 arr+1:1 arr+num/2
  if(arr[num/2].score > arr[num].score) {
    cout<<arr[num].loc<<endl;
  } else {
    cout<<arr[num/2].loc<<endl;
  }
  return 0;
}
相关文章
|
13天前
USACO1.3 修理牛棚
USACO1.3 修理牛棚
|
10月前
AcWing 867. 分解质因数
AcWing 867. 分解质因数
|
6月前
hdu1406 完数 (水题)
hdu1406 完数 (水题)
27 0
|
8月前
|
算法
[USACO 2007 Jan S]Protecting the Flowers
[USACO 2007 Jan S]Protecting the Flowers
|
8月前
[NOIP1998]拼数
[NOIP1998]拼数
|
10月前
1309:【例1.6】回文数(Noip1999)
1309:【例1.6】回文数(Noip1999)
107 0
|
10月前
1260:【例9.4】拦截导弹(Noip1999) 2021-01-15
1260:【例9.4】拦截导弹(Noip1999) 2021-01-15
P5712 【深基3.例4】Apples
P5712 【深基3.例4】Apples
120 0
P5706 【深基2.例8】再分肥宅水
P5706 【深基2.例8】再分肥宅水
119 0