1 条题解

  • 0
    @ 2025-8-24 22:43:44

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Kubic
    Go straight ahead 'til we've lost it all.

    搬运于2025-08-24 22:43:44,当前版本为作者最后更新于2022-12-31 20:29:44,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    只有第一秒走的长度为奇数,后面每一秒走的长度都为偶数,因此所有除 00 外的偶数点都是不可达的。

    nn 为奇数时,设 dd 为满足 i=1d2i1n\sum\limits_{i=1}^d 2^{i-1}\ge n 的最小值。可以证明答案为 dd

    证明:

    初始令每一秒都是往右走的,我们需要将某一些秒调整为往左走使得最终恰好走到 nn

    m=i=1d2i1nm=\sum\limits_{i=1}^d 2^{i-1}-n。显然 mm 为偶数。

    我们需要找到一些秒,使得这些秒中走的距离之和恰好为 m2\dfrac{m}{2},并将这些秒调整为往左走。

    只需要找出 m2\dfrac{m}{2} 的二进制表示,将它分解为若干个互不相同的 22 的幂之和,这样就一定可以得到一组方案。

    时间复杂度 O(T)O(T)O(Tlogn)O(T\log n)

    参考代码:

    #include <bits/stdc++.h>
    using namespace std;
    int T,n;
    void slv()
    {
    	scanf("%d",&n);
    	if(n&1) printf("%d\n",32-__builtin_clz(n));
    	else printf("-1\n");
    }
    int main()
    {
    	scanf("%d",&T);
    	while(T--) slv();return 0;
    }
    
    • 1

    信息

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