题解:B4210 [常州市赛 2022] 最早对决

· · 题解

解题思路

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

#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)

2. 相遇轮次计算原理

设批次为 n,根据赛制:

3. 典型示例

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

时间复杂度O(1)

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