zoukankan      html  css  js  c++  java
  • Codeforces Round #695 (Div. 2)

    Codeforces Round #695 (Div. 2)

    A. Wizard of Orz

    题意:给定一排 (n) 个个位计时器,每秒都会 +1,并且 9 + 1 = 0。如果在某瞬间暂停某个计时器,那下一秒 (i -1) (i + 1)也会停止,以此类推至全部计时器停止,问在那秒停止会使显示的数字最大。

    思路:要使显示数字最大,使首位为 (9) 即可,在第二个计时器到 8 的时候暂停一定最大。

    int main() {
        ios_base::sync_with_stdio(false), cin.tie(0);
        for (cin >> _; _--;) {
            int n; cin >> n;
            cout << 9;
            for (int i = 1; i < n; ++i) cout << (i + 7) % 10;
            cout << "
    ";
        }
        return 0;
    }
    

    B. Hills And Valleys

    山谷定义看题意,循环一次数组把 (a_i) 分别用 (a_{i + 1})(a_{i - 1})代替求算 山谷和

    模拟的时候发现 ans 其实最多为 2(0,1,2),

    比如在 6 1 5 4 5,这组数据把(a_3) 替换为 1 时 ans = 2.

    具体代码实现

    using ll = long long;
    int _, n;
    vector<ll> a;
    bool check(int i) {
        if (i == 0 || i == n - 1) return false;
        return (a[i] > a[i + 1] && a[i] > a[i - 1]) ||
               (a[i] < a[i + 1] && a[i] < a[i - 1]);
    }
    int main() {
        ios_base::sync_with_stdio(false), cin.tie(0);
        for (cin >> _; _--;) {
            cin >> n;
            a = vector<ll>(n);
            for (auto& x : a) cin >> x;
            int ans = 0, cnt = 0;
            for (int i = 1, b, c; i < n - 1; ++i) {
                int t = a[i];
                cnt += check(i);
                b = c = check(i) + check(i - 1) + check(i + 1);
                a[i] = a[i + 1], b -= check(i - 1);
                a[i] = a[i - 1], c -= check(i + 1);
                ans = max({ans, b, c});
                a[i] = t;
            }
            cout << cnt - ans << "
    ";
        }
        return 0;
    }
    

    C. Three Bags

    我们有三个背包,可以进行一种操作:

    • 移除一个背包中的一个数b,另一个背包中的一个数a变为a-b

    问我们最后剩余的一个数最大可以为多少?

    那么我们可以考虑最后剩余的一个数在哪个背包中,我们以在A背包中为例。

    我们有三个背包,可以进行一种操作:

    • 移除一个背包中的一个数b,另一个背包中的一个数a变为a-b

    问我们最后剩余的一个数最大可以为多少?

    那么我们可以考虑最后剩余的一个数在哪个背包中,我们以在A背包中为例。

    对于A背包中的数来说

    我们将A背包的数作为b转移出去,再转移回来,负负得正,那么最后一个数可以加上A背包中所有的数的和

    那么对于B和C背包来说有两种情况

    • B背包和C背包都剩下一个数,B、C背包中其他的数通过除了A之外的另一个背包先转换为 -b ,再转移到A背包中变为 b,随后在A背包中减去B、C背包中剩下的这个数,那么显然,当剩下的这两个数最小时,结果最优。
    • B背包和C背包只有一个背包剩下一个数,那么这种情况就是,其中一个背包全部作为-b转移到除了A背包之外的另一个背包,再转移到A背包中就变为了 b ,剩下的那个背包全部作为-b转移到A背包中。

    我们将A背包的数作为b转移出去,再转移回来,负负得正,那么最后一个数可以加上A背包中所有的数的和

    那么对于B和C背包来说有两种情况

    • B背包和C背包都剩下一个数,B、C背包中其他的数通过除了A之外的另一个背包先转换为 -b ,再转移到A背包中变为 b,随后在A背包中减去B、C背包中剩下的这个数,那么显然,当剩下的这两个数最小时,结果最优。
    • B背包和C背包只有一个背包剩下一个数,那么这种情况就是,其中一个背包全部作为-b转移到除了A背包之外的另一个背包,再转移到A背包中就变为了 b ,剩下的那个背包全部作为-b转移到A背包中。
    using ll = long long;
    int _;
    vector<ll> w[3];
    vector<int> n(3);
    ll cal() {
        ll ans = 0, s1 = 0, s2 = 0, m1 = w[1][0], m2 = w[2][0];
        for (int i = 0; i < n[0]; i++) ans += w[0][i];
        for (int i = 1; i < n[1]; i++) s1 += w[1][i];
        for (int i = 1; i < n[2]; i++) s2 += w[2][i];
    
        ans += max({s1 + s2 - m1 - m2, s1 + m1 - s2 - m2, s2 + m2 - s1 - m1});
        return ans;
    }
    int main() {
        ios_base::sync_with_stdio(false), cin.tie(0);
        for (int i = 0; i < 3; ++i) cin >> n[i];
        w[0].resize(n[0]), w[1].resize(n[1]), w[2].resize(n[2]);
        for (int i = 0; i < 3; ++i) {
            for (int j = 0; j < n[i]; ++j) cin >> w[i][j];
            sort(w[i].begin(), w[i].end());
        }
        ll ans = -1e18;
        // 现在考虑三种情况
        ans = max(ans, cal());  // A,B,C
    
        swap(w[0], w[1]), swap(n[0], n[1]);
        ans = max(ans, cal());  // B,A,C
    
        swap(w[0], w[2]), swap(n[0], n[2]);
        ans = max(ans, cal());  // C,A,B
    
        cout << ans << "
    ";
        return 0;
    }
    

    D. Sum of Paths

    题意

    有个机器人在 ([1,n])的直线方格上面走 (k) 步,求所有路线下每个格子经过的次数。

    思路

    (dp[i,j]):走 (i) 步到 (j) 方格的路线数。
    对于每一个方格,枚举他作为中转点即可。

    [sum[i] = (sum[i] + dp[j,i] * dp[k-j,i] \% mod) \% mod ]

    using ll = long long;
    const int MXN = 5e3 + 10;
    const int mod = 1e9 + 7;
    ll a[MXN];
    ll dp[MXN][MXN];
    ll sum[MXN];
    int main() {
        int n, k, q;
        cin >> n >> k >> q;
        for (int i = 1; i <= n; i++) {
            scanf("%lld", &a[i]);
        }
        for (int i = 1; i <= n; i++) dp[0][i] = 1;
        for (int i = 1; i <= k; i++) {
            dp[i][1] = dp[i - 1][2];
            dp[i][n] = dp[i - 1][n - 1];
            for (int j = 2; j < n; j++) {
                dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j + 1]) % mod;
            }
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 0; j <= k; j++)
                sum[i] = (sum[i] + dp[j][i] * dp[k - j][i] % mod) % mod;
        }
    
        ll ans = 0;
        for (int i = 1; i <= n; i++) ans = (ans + sum[i] * a[i] % mod) % mod;
        while (q--) {
            ll i, x;
            scanf("%lld%lld", &i, &x);
            ans =
                ((ans - sum[i] * a[i] % mod + sum[i] * x % mod) % mod + mod) % mod;
            cout << ans << '
    ';
            a[i] = x;
        }
        return 0;
    }
    

    The desire of his soul is the prophecy of his fate
    你灵魂的欲望,是你命运的先知。

  • 相关阅读:
    PATA 1071 Speech Patterns.
    PATA 1027 Colors In Mars
    PATB 1038. 统计同成绩学生(20)
    1036. 跟奥巴马一起编程(15)
    PATA 1036. Boys vs Girls (25)
    PATA 1006. Sign In and Sign Out (25)
    读取web工程目录之外的图片并显示
    DOS命令
    java连接oracle集群
    servlet
  • 原文地址:https://www.cnblogs.com/RioTian/p/14354163.html
Copyright © 2011-2022 走看看