为什么两份代码效率差距这么大……

P3612 [USACO17JAN] Secret Cow Code S

lzy20091001 @ 2023-07-22 10:34:27

代码1,只过了1个点,我觉得这个反而应该快一点才对啊

测评信息

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    long long n, len;
    string str;
    cin >> str >> n;
    len = str.length();
    while (len < n)
        len = len << 1;
    while (n > str.length())
    {

        len = len >> 1;
        if (n == len + 1)
            n = len;
        else
            n = n - 1 - len;
    }
    cout << str[n - 1] << "\n";
    return 0;
}

代码2,秒过

测评信息

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    long long n, len;
    string str;
    cin >> str >> n;
    while (n > str.length())
    {
        len = str.length();
        while (len < n)
            len = (len << 1);
        len = len >> 1;
        if (n == len + 1)
            n = len;
        else
            n = n - 1 - len;
    }
    cout << str[n - 1] << "\n";
    return 0;
}

by lzy20091001 @ 2023-07-22 10:35:43

可以直接at我


by luminary3 @ 2023-07-22 10:42:09


by typerxiaozhu @ 2023-07-22 10:51:58

因为你两个代码逻辑不一样,第一份 len 始终是一个值,而你的第二份代码 n 发生了变化,所以len<n 这个条件也跟之前不一样,自然 len 的值每次也不一样


by Bingxiu @ 2023-07-22 10:52:51

@lzy20091001 因为 n 有可能直接从 2^{k+2} 级别直接跳到 2^k 级别甚至更小,第一份代码应该改为 while((len>>1)>=n) len = len >> 1;


|