Educational Codeforces Round 155 (Rated for Div. 2) 题解 A-C

15 篇文章 0 订阅
12 篇文章 0 订阅

A - Rigged!

原题链接

题目描述
n个运动员参加举重比赛,第i个运动员的力气为 s i s_i si,耐力为 e i e_i ei,你的朋友小明是第一名运动员,你非常希望小明能够获胜。现在,你可以选择一个杠铃的重量为w,让这n个运动员进行举重,如果第i个运动员的 s i s_i si会严格大于w,那么他可以举起这个杠铃 e i e_i ei秒,最终举起杠铃时间久者获胜,如果时间相同则没有胜者。现在需要你求出那个w值,如果任意的w值都无法让小明获胜,输出-1,否则输出w

思路:贪心+模拟

  • 贪心的让这个w最大,最大为 s 1 − 1 s_1 - 1 s11,那么看其他n-1个运动员的力气 s i s_i si是否有大于等于w且耐力会大于等于 e 1 e_1 e1的,如果存在,那么答案为-1,否则就是 s 1 − 1 s_1-1 s11
public static void solve() throws IOException {
    int n = readInt();
    Pair[] pairs = new Pair[n + 1];
    Arrays.setAll(pairs, g-> new Pair());
    for (int i = 1; i <= n; i++) {
        pairs[i] = new Pair(readInt(), readInt());
    }
    boolean f = false;
    int p = pairs[1].first , q = pairs[1].second;
    for (int i = 2; i <= n; i++) {
        if (pairs[i].first >= p && pairs[i].second >= q) {
            f = true;
        }
    }
    printWriter.println(f ? "-1" : p);
}

B - Chips on the Board

原题链接

题目描述
你有一个 n ∗ n n * n nn的棋盘,上面没有任何棋子,现在又给你两个长度为n的正整数数组ab,其中a中的数 a i a_i ai只能放在棋盘的第i行作为棋子,b中的数 b i b_i bi只能放在棋盘的第i列作为棋子,现在这个棋盘需要满足每一行或者每一列至少有一个棋子,求所有棋子的值之和最小为多少。

思路:贪心+模拟

  • 求出数组a和数组b的最小值。
  • 枚举每一行都有棋子或者每一列都有棋子,取最小值。
  • mina用来与每一列组合,minb用来与每一行组合。
  • 这题和 2023icpc网络预选赛第二场的D题有点类似。
public static void solve() throws IOException {
    int n = readInt();
    int[] a = utils.nextIntArray(n), b = utils.nextIntArray(n);
    int mina = utils.forceInt(1e9) + 10, minb = utils.forceInt(1e9) + 10;
    for (int i = 1; i <= n; i++) {
        mina = Math.min(mina, a[i]);
        minb = Math.min(minb, b[i]);
    }

    long suma = 0, sumb = 0;
    for (int i = 1; i <= n; i++) {
        suma += 1l * a[i] + minb;// 每一行都用b数组的最小值来合并
        sumb += 1l * b[i] + mina;// 每一列都用a数组的最小值来合并
    }
    printWriter.println(Math.min(suma, sumb));
}

C - Make it Alternating

原题链接

题目描述
给定一个二进制字符串s,你可以对s进行任意次删除字符的操作,使得s中的字符交替出现。求出使得s中所有字符交替出现的最少操作次数和方案总数。

思路:数学+思维+全排列

  • 最少操作数即将删除所有连续出现的字符使其变为单独的一个的操作数总和。
  • 方案数即对所有选法方案进行阶乘,例如输入为0001100,那么我们选择的方案总数为 C 3 2 ∗ C 2 1 ∗ C 2 1 ∗ A 4 4 C_{3}^{2} * C_{2}^{1} * C_{2}^{1} * A_{4}^{4} C32C21C21A44
static int mod = 998244353;
public static void solve() throws IOException {
    String s = readString();
    int minOp = 0;
    long totalOps = 1;
    for (int l = 0, r = 0; l < s.length(); l = r) {
        while (r < s.length() && s.charAt(l) == s.charAt(r)) {
            r++;
        }
        minOp += r - l - 1;// 将连续相同的字符个数再-1
        totalOps = (totalOps * (r - l)) % mod;
    }
    for (int i = 1; i <= minOp; i++) {
        totalOps = (totalOps * i) % mod;
    }

    printWriter.println(minOp + " " + totalOps);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值