2024.08.24-OPPO

-
-
2024-08-28

A. 题目链接

算法标签:模拟。

思路:先计算出arr的sum,然后枚举删除arr[i]判断即可。

public class P1938 {
    // https://codefun2000.com/p/P1938
    public static void solve() throws IOException {
        int n = in.nextInt();
        long t = in.nextLong();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) a[i] = in.nextInt();
        long s = Arrays.stream(a).sum();
        int ans = 0;
        for (int x : a) {
            long v = (s - x) - x;
            if (v >= 0 && v <= t) ans++;
        }

        out.println(ans);
    }
}

B. 题目链接

算法标签:哈希表,模拟

思路:先计算一个mex值(不在arr中的最小非负整数)。然后统计每个元素出现的次数,枚举删除每个元素arr[i],如果arr[i]出现次数为1,并且arr[i] < mex, 那么删除后的最小非负整数就是arr[i],否则是mex。

public class P1939 {

    // https://codefun2000.com/p/P1939

    public static void solve() throws IOException {
        int n = in.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) a[i] = in.nextInt();
        Map<Integer, Integer> map = new HashMap<>();
        for (int v : a) {
            if (v < n) map.merge(v, 1, Integer::sum);
        }
        int mex = 0;
        for (int i = 0; i < n; i++) {
            if (map.getOrDefault(i, 0) == 0) {
                mex = i;
                break;
            }
        }
        int[] ans = new int[n];
        for (int i = 0; i < n; i++) {
            if (a[i] < n && map.get(a[i]) == 1 && mex > a[i]) {
                ans[i] = a[i];
            } else {
                ans[i] = mex;
            }
        }
        for (long v : ans) out.print(v + " ");
    }
}

C. 题目链接

算法标签:动态规划、数学。

思路:一个数字如果是3的倍数,那么它的数位和也是3的倍数。知道这个性质后,我们可以枚举每一个 ? [0~9],然后用dp计算出方案数。这个过程中不断的对数位和取模,因为 (a + b + c) % 3 == ((a % 3) + (b % 3) + (c % 3)) % 3。最后判断下这个数字 % 3 是否为0即可。

public class P1940 {
    // https://codefun2000.com/p/P1940
    // 一个数字如果是3的倍数,那么它的数位和也是3的倍数
    // ext -> 如果一个数字是 9 的倍数,那么它的数位和也是 9 的倍数
    // (a + b + c) % 3 == ((a % 3) + (b % 3) + (c % 3)) % 3

    static final int MOD = (int) (1e9 + 7);
    static String s;
    static long[][] dp;

    static long dfs(int i, int v) {
        if (i >= s.length()) return v % 3 == 0 ? 1 : 0;
        if (dp[i][v] != -1) return dp[i][v];
        long ans = 0;
        if (s.charAt(i) == '?') {
            for (int x = 0; x <= 9; x++) {
                ans += dfs(i + 1, (v + x) % 3);
            }
        } else {
            ans += dfs(i + 1, (v + (s.charAt(i) - '0')) % 3);
        }
        ans %= MOD;
        return dp[i][v] = ans;
    }

    public static void solve() throws IOException {
        int n = in.nextInt();
        s = in.nextLine();
        dp = new long[n + 1][3];
        for (long[] d : dp) Arrays.fill(d, -1);
        long res = dfs(0, 0);
        out.println(res);
    }
}

梅狸猫
meilicat
公告

随便看看就好~