1 条题解

  • 0
    @ 2026-3-10 9:10:19

    文字教学

    这道题用二分查找就能高效解决,因为每次询问能把范围缩小一半,询问次数只有 log2n\log_2 n 次(远小于题目给的 cc 限制):

    1. 初始猜数范围是左边界 l=1,右边界 r=n
    2. 每次取中间值 mid,调用 Seniorious(mid) 问结果:
      • 若返回 0,说明 mid 就是要找的 kk,直接返回;
      • 若返回 1,说明 kkmid 小,把右边界调到 mid-1
      • 若返回 -1,说明 kkmid 大,把左边界调到 mid+1

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    extern "C" int Seniorious(int);
    
    extern "C" int Chtholly(int n, int c) {
        int l = 1, r = n;
        while (l <= r) {
            int mid = (l + r) / 2;
            int res = Seniorious(mid);
            if (res == 0) return mid;
            else if (res == 1) r = mid - 1;
            else l = mid + 1;
        }
        return -1;
    }
    
    • 1

    信息

    ID
    5393
    时间
    1000ms
    内存
    128MiB
    难度
    3
    标签
    递交数
    1
    已通过
    1
    上传者