1 条题解

  • 0
    @ 2025-8-24 21:17:52

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar yd021a
    "May you, the beauty of this world, always shine."

    搬运于2025-08-24 21:17:51,当前版本为作者最后更新于2025-06-14 20:28:34,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    解题思路

    本题关键在于判断两人是否为种子选手:

    • 非种子选手情况
      若其中一人或两人都不是种子选手(编号 > 3232),则最小相遇轮次为 11(非种子选手随机抽签)。

    • 种子选手情况
      若两人都是种子选手(编号 ≤ 3232),需计算他们的批次:

      1. 通过位运算确定选手批次:满足 2l1<x2l2^{l-1} < x \leq 2^l 的最小 ll
      2. 取两人批次最大值 max(a,b)\max(a,b)
      3. 相遇轮次公式:8max(a,b)+18 - \max(a,b) + 1

    爱门!

    代码实现

    #include<bits/stdc++.h>
    using namespace std;
    int g(int x){
        int l=0;
        while((1<<l)<x) l++;
        return l+1;
    }
    inline long long int read(){
    	long long int w=1,s=0;
    	char ch;
    	while(ch<'0'||ch>'9'){
    		if(ch=='-') w=-1;
    		ch=getchar();
    	}
    	while(ch>='0'&&ch<='9'){
    		s=s*10+ch-'0';
    		ch=getchar();
    	}
    	return w*s;
    }
    int main(){
        int s,t;
        s=read(),t=raed();
        if (s>t) swap(s,t);
        
        if (s<=32&&t<=32){  // 两人均为种子选手
            int a=g(s);
            int b=g(t);
            int maxx=max(a,b);
            cout<<8-maxx+1<<endl;
        } 
        else{ // 至少一人非种子选手
            cout<<1<<endl;
        }
        return 0;
    }
    

    算法解析

    1. 批次计算函数 g(x)

    • 通过位运算 (1 << l) < x 确定满足条件的最小 l
    • 返回值 l + 1 表示选手所在批次。
    • 示例
      • x=1x=1l=0l=0 → 批次 11
      • x=3x=3l=2l=2 → 批次 33

    2. 相遇轮次计算原理

    设批次为 nn,根据赛制:

    • nn 批种子占据 28n2^{8-n} 个位置。
    • 两人相遇轮次公式:相遇轮次=8max(a,b)+1\text{相遇轮次} = 8 - \max(a,b) + 1

    3. 典型示例

    选手编号 计算过程 相遇轮次 说明
    (1, 2) max(1,2)=282+1\max(1,2)=2 → 8-2+1 7 决赛相遇
    (1, 3) max(1,3)=383+1\max(1,3)=3 → 8-3+1 6 半决赛相遇
    (33, 34) 非种子选手 1 第一轮相遇

    时间复杂度O(1)O(1)


    我的题解就到此为止了,看完这篇以后,就是你来写了。(来自 2.22.2 的剧情感想)

    • 1

    信息

    ID
    7690
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者