『题解』UVa online judge UVA11714 Blind Sorting

题目传送门

题目大意

给定 \(n\) 个不变但未知的正整数,每次询问可以选取两个数并得知两个数的大小关系。

问:最坏情况下,至少需要几次询问,才能知道最大数和次大数是哪两个数?

思路

我们分为两个问题:

  • 最坏情况下,至少需要几次询问,才能知道最大数是哪个数?
  • 最坏情况下,至少需要几次询问,才能知道次大数是哪个数?

首先看最大数,我们把这些数两两比较,找出较小数删除,再进行两两比较,例如一个长度为 \(4\) 的序列:\(1,2,3,4\),对其进行查找最大数:

查找最大值二叉树

(图丑勿喷)

可以发现,从一个序列中找出最大数,只需要 \(\lfloor \log_2n-1 \rfloor\) 次比较。

而次大数,要在除去最大数里找,没有什么快点的方法,所以比较 \(n-1\) 次。

最后的答案也显而易见:\(\lfloor \log_2n-1 \rfloor +n-1\)

代码

#include <iostream>
#include <cmath>
using namespace std;

int main(){
    int n;
    while(cin >> n){
        cout << (int)log2(n-1)+n-1 << endl;
    }
    return 0;
}
posted @ 2022-01-21 21:27  仙山有茗  阅读(29)  评论(0编辑  收藏  举报