• 【深基16.例1】淘汰赛(上)


    题目链接【深基16.例1】淘汰赛 - 洛谷https://www.luogu.com.cn/problem/P4715

     题目描述

            有 2^n(n≤7) 个国家参加世界杯决赛圈且进入淘汰赛环节。已知各个国家的能力值,且都不相等。能力值高的国家和能力值低的国家踢比赛时高者获胜。1号国家和2号国家踢一场比赛,胜者晋级。3号国家和4号国家也踢一场,胜者晋级……晋级后的国家用相同的方法继续完成赛程,直到决出冠军。给出各个国家的能力值,请问亚军是哪个国家?

    输入

    第一行一个整数n,表示一共2^n个国家参赛。

    第二行2^n个整数,第i个整数表示编号为i的国家的能力值(1≤i≤2^n)。

    数据保证不存在平局。

    输出

    仅一个整数,表示亚军国家的编号。

    样例组

    1. 输入
    2. 3
    3. 4 2 3 1 10 5 9 7
    4. 输出
    5. 1

    题目思路

            这道题目在洛谷的二叉树题单中。但我不会手写二叉树,那该怎么办呢?既然二叉树这条路行不通,那似乎还可以借助STL库来解决这道题目。

            用红黑树还是priority_queue?都不是。我们可以借助vector和pair来解决这道题目。

            我们可以将利用pow()函数求出输入的总队伍数量,然后将其除2,写两个for循环,从而将读入分给两个vector数组a,b

            读入程序如下:

    1. void dr(vectorint,int> >a,vectorint,int> >b,int n)
    2. {
    3. int x,m;
    4. cin>>n;
    5. x=pow(2,n)/2;//等价于x=pow(2,n-1);
    6. for(int i=1;i<=x;i++) cin>>m,a.push_back(make_pair(m,i));
    7. for(int i=1;i<=x;i++) cin>>m,b.push_back(make_pair(m,i+x));//注意后面应该for循环的i要加x
    8. }

    核心程序

              然后,我们对数组a进行sort()操作,数组b同样也进行sort()操作(核心程序),然后就有两种可行做法:

            第一种做法是先将a,b进行reverse()操作,再比较a数组首位的实力值(first)和b数组首位的实力值(vector数组下标起始是0)。输出其中实力值较小的一个数的序号(.second)。

            时间复杂度O(n)。

            这样做的话,程序如下(程序多了一行reverse):

    1. void sc(vector >a,vector >b)
    2. {
    3. reverse(a.begin(),a.end());reverse(b.begin(),b.end());
    4. if(a[0].first>b[0].first) cout<<b[0].second;
    5. else cout<<a[0].second;
    6. }

            第二种做法则是直接比较a,b的最后一位(倒数最后一名就是第一名)的实力值,然后输出其中实力值底的队伍的序号。

            时间复杂度O(1)。

            这样做的话,程序如下:

    1. void sc(vectorint,int> >a,vectorint,int> >b)
    2. {
    3. if(a[a.size()-1].first>b[b.size()-1].first) cout<size()-1].second;
    4. else cout<size()-1].second;
    5. }

    程序总结  

            那么总时间复杂度在O(n log n)和O(n*n)之间。考虑到2的7次方是128,而128的平方还不到两万(16384),那么这段程序是肯定可以过的。

            这样做可以得到两段程序。

            第一段程序如下:

    1. #include
    2. #define vp vector >
    3. using namespace std;
    4. vp a,b;int n,m,x;
    5. int main()
    6. {
    7. cin>>n;
    8. x=pow(2,n)/2;
    9. for(int i=1;i<=x;i++)
    10. cin>>m,a.push_back(make_pair(m,i));
    11. for(int i=1;i<=x;i++)
    12. cin>>m,b.push_back(make_pair(m,i+x));
    13. sort(a.begin(),a.end());sort(b.begin(),b.end());
    14. reverse(a.begin(),a.end());reverse(b.begin(),b.end());
    15. if(a[0].first>b[0].first)
    16. cout<0].second;
    17. else cout<0].second;
    18. return 0;
    19. }

            (第二段见下篇。)

  • 相关阅读:
    第K位数字
    JavaEE之HTTP协议(1)_HTTP基础知识,HTTP 请求、响应格式,方法,状态码
    基于正点原子stm32的mini板的TFTLCD显示实验
    考研操作系统-1.计算机系统概述
    【系统性】 循序渐进学C++
    小程序中如何设置多门店/多人/多商品价格库存等复杂场景设置
    Linux 6.10也引进了蓝屏机制
    【wp】2023第七届HECTF信息安全挑战赛 Web
    重庆大学c++、2022级-第5次实验-运用STL的容器和算法编写程序
    文举论金:黄金原油全面走势分析策略独家指导
  • 原文地址:https://blog.csdn.net/ceshyong/article/details/126185022