1 solutions

  • 0
    @ 2025-5-10 13:48:32

    本题的目标为求得 xx 在执行 nn 次操作 1 和 mm 次操作 2 后的最小值和最大值。

    解题思路

    (以下的 // 符号均为整数除法) 操作 1 相当于 xx/2x \leftarrow x / 2; 操作 2 相当于 x(x+1)/2x \leftarrow (x + 1) / 2

    引理

    引理 1a/b+c=(a+bc)/ba/b+c=(a+bc)/ba,b,ca,b,c 为正整数。 证明:设 a/b=ka/b=k,则 bka<(b+1)kbk\leq a<(b+1)k,从而b(k+c)a+bc<b(k+c+1)b(k+c)\leq a+bc<b(k+c+1),故 (a+bc)/b=k+c=a/b+c(a+bc)/b=k+c=a/b+c,故成立。

    引理 2a/b/c=a/(bc)a/b/c=a/(bc)a,b,ca,b,c 为正整数。 证明:设 a/(bc)=ka/(bc)=k,则 bcka<bc(k+1)bck\leq a<bc(k+1),从而 cka/b<c(k+1)ck\leq a/b<c(k+1),故 a/b/c=k=a/(bc)a/b/c=k=a/(bc)

    解题

    假设 m=1m=1,且第 kk 次操作为操作 2,那么 xx 进行 n+mn+m 次操作后的结果为

    $$\begin{aligned} &(x\underbrace{/2/2/\cdots/2}_{k-1}+1)/2\underbrace{/2\cdots/2}_{n-k+1} \\ =&(x/2^{k-1}+1)/2^{n-k} \\ =&(x+2^{k-1})/2^{n+1} \end{aligned} $$

    可以看出,当 k=1k=1,即最先执行操作 2 时结果最小;当 k=n+1k=n+1,即最后执行操作 2 时结果最大。 同理,假设执行 mm 次操作 2,分别为第 k1,k2,,kmk_1,k_2,\cdots,k_m 次,则最终结果为

    (x+2k11+2k21++2km1)/2n+m(x+2^{k_1-1}+2^{k_2-1}+\cdots+2^{k_m-1})/2^{n+m}

    因此,最先执行 mm 次操作 2 时为最小值,最后执行 mm 次操作 2 时为最大值。

    代码

    #include <iostream>
    
    int getMin(int x, int n, int m) {
        // x = 0 或 1 时死循环,跳出
        while (m > 0 && x > 1) {
            m--;
            x = (x + 1) / 2;
        }
        // x = 0 时死循环,跳出
        while (n > 0 && x > 0) {
            n--;
            x = x / 2;
        }
        return x;
    }
    
    int getMax(int x, int n, int m) {
        while (n > 0 && x > 0) {
            n--;
            x = x / 2;
        }
        while (m > 0 && x > 1) {
            m--;
            x = (x + 1) / 2;
        }
        return x;
    }
    
    void solve() {
        int x, n, m;
        std::cin >> x >> n >> m;
        std::cout << getMin(x, n, m) << " " << getMax(x, n, m) << std::endl;
    }
    
    int main() {
        int T = 100;
        while(T--) {
            solve();
        }
        return 0;
    }
    

    Information

    ID
    29
    Time
    1000ms
    Memory
    512MiB
    Difficulty
    2
    Tags
    # Submissions
    5
    Accepted
    2
    Uploaded By