CodeForces-1278B-A-and-B
阅读原文时间:2023年09月03日阅读:3

题意

对于\(t(1\leq t\leq 100)\)个测试点,给两个数\(a\)和\(b\),作如下操作:

第一次挑一个数使其加\(1\),第二次挑一个数使其加\(2\),以此类推,最后两个数相等,问最小操作数。

分析

题目所述意思即为挑选最小的\(n\),满足以下等式\((\pm\)表示可取正号可取负号\()\)

\[\pm1\pm2\pm3\pm\cdots\pm n= \left|a-b\right|\tag{1}
\]

我们令\(\left|a-b\right|\)为\(x\),我们先找到最小的\(k\)满足\(\frac{k*(k+1)}{2}\geq x\),即\((1)\)式中全为加号\((\)如果全为加号都不满足,其中一些变为减号肯定更不满足\()\)。我们有一个以下式子

\[1+2+\cdots+k=x+y\tag{2}
\]

其中\(y\)为超过的部分。

\(1.\)如果\(y\)是偶数,我们已知\(y<k\),否则不满足上述\(k\)最小。那么我们将\(\frac{y}{2}\)的符号变为负号即可满足\((1)\)式,那么答案就是\(k\)。

\(2.\)如果\(y\)是奇数,那么该式子将一些正号变为负号也肯定不满足(改变后式子的值变化为偶数),我们往\((2)\)式左右都加上\(k+1\)。

  • 如果\(k+1\)是偶数,那么\(y+k+1\)仍然为奇数,同上,仍不满足,我们需两边再加上\(k+2\),\(y+2*k+1\)为偶数,我们将\(\frac{y+1}{2}\)和\(k\)的符号变为负号即可满足\((1)\)式,\((y+1=2*k\)显然不满足条件\()\),那么答案就是\(k+2\)。

  • 如果\(k+1\)是奇数,那么\(y+k+1\)为偶数,我们将\(\frac{y+k+1}{2}(\frac{y+k+1}{2}<k+1)\)的符号变为负号即可满足\((1)\)式,那么答案就是\(k+1\)

    #pragma GCC optimize(3, "Ofast", "inline")

    #include

    #define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    #define ll long long
    #define LL long long
    #define pii pair
    #define int ll
    #define ls st<<1
    #define rs st<<1|1
    using namespace std;
    const int maxn = (ll) 1e5 + 5;
    const int mod = (ll) 1e9 + 7;
    const int inf = 0x3f3f3f3f3f3f3f3f;
    int sum[maxn];

    signed main() {
    start;
    for (int i = 1; i < maxn; ++i) sum[i] = sum[i - 1] + i; int T; cin >> T;
    while (T--) {
    int a, b;
    cin >> a >> b;
    if (a > b)
    swap(a, b);
    int x = b - a;
    int ans = lower_bound(sum, sum + maxn, x) - sum;
    if ((sum[ans] - x) & 1) {
    if (ans & 1)
    cout << ans + 2 << '\n';
    else
    cout << ans + 1 << '\n';
    } else
    cout << ans << '\n';
    }
    return 0;
    }

我现在连\(Div2\)的\(B\)都能卡一小时吗,我是真的菜

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章