CodeForces 1613

A

十分简单,先把\(x1\)\(x2\)的位数统一,然后以\(p\)为第一关键字,\(x\)为第二关键字比较即可

#include <cstdio>
#include <cmath>
int main()
{
    int T; scanf("%d", &T);
    while (T--) {
        int x1, p1, x2, p2; scanf("%d%d%d%d", &x1, &p1, &x2, &p2);
        int n = x1, m = x2, cnt1 = 0, cnt2 = 0;
        while (n != 0) n /= 10, cnt1++;
        while (m != 0) m /= 10, cnt2++;
        if (cnt1 > cnt2) 
            x2 *= std::pow(10, cnt1 - cnt2), p2 -= cnt1 - cnt2;
        if (cnt2 > cnt1) 
            x1 *= std::pow(10, cnt2 - cnt1), p1 -= cnt2 - cnt1;
        if (p1 > p2) puts(">");
        else if (p1 == p2) {
            if (x1 < x2) puts("<");
            else if (x1 == x2) puts("=");
            else puts(">");
        }
        else puts("<");
    }
    return 0;
}

B

显然,\(x\bmod y < y\)

因此,选择 \(y\) 作为序列中的最小数字,选择 \(x\) 作为其他任何数字,就可以得到至少 \(n-1\) 对。对于任何正的 \(n\) ,显然有 \(n-1≥ \left \lfloor \frac{n}{2} \right \rfloor\)

复杂度 \(O(Tn)\)

#include <cstdio>
#include <algorithm>
int a[2000005], minn;
int main()
{
    int T; scanf("%d", &T);
    while (T--) {
        int n; scanf("%d", &n);
        minn = 2147483647;
        for (int i = 1; i <= n; i++)
            scanf("%d", &a[i]), minn = std::min(minn, a[i]);
        for (int i = 1, k = 1; k <= n / 2; i++) 
            if (a[i] != minn) 
                printf("%d %d\n", a[i], minn), k++;
    }
    return 0;
}

C

显然,在 \(i<n\) 的情况下,第 \(i\) 次攻击造成的伤害为 \(\min(k, a_{i+1}-a_i)\) 秒,在 \(i=n\) 的情况下,总伤害为 \(k+\sum\limits_{i=1}^{n-1}\min(k, a_{i+1}-a_i)\)

可以看到,\(k\)的值越高,总和就越大。

所以我们可以二分 \(k\) ,找到总和大于或等于 \(h\) 时的最小值。

#include <cstdio>
#include <algorithm>
#define ll long long
ll a[105], n, h;
int main()
{
    int T; scanf("%d", &T);
    while (T--) {
        scanf("%lld%lld", &n, &h);
        for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
        ll l = 1, r = 1e18;
        while (l <= r) {
            ll mid = l + r >> 1, ans = mid;
            for (int i = 1; i < n; i++) 
                ans += std::min(mid, a[i + 1] - a[i]);
            if (ans < h) l = mid + 1;
            else r = mid - 1;
        }
        printf("%lld\n", r + 1);
    }
    return 0;
}
posted @ 2022-03-18 16:31  Tritons  阅读(68)  评论(0)    收藏  举报
页脚Html代码: