分享丨小红书笔试分享和讨论
1850
2024.03.29
2024.03.30
发布于 未知归属地

test1:有n张牌,你有两发子弹,需要分别同时命中第一张牌和最后一张张牌,尝试求出概率,结果四舍五入保留10位小数;
实例
输入:2
输出:1.0000000000
test2:你有n个小红书账号,每个账号粉丝为a_n,你需要创建一个粉丝为k的新账号,你可以通过老账号发推文来宣传新账号,宣传的方式有两种。第一种是浅度宣传,浅度宣传可以为新账号增加a_n/2(向下取整)粉丝。第二种是重度宣传,重度宣传可以为新账号增加a_n粉丝。其中重度宣传你最多使用一次。求需要最少账号个数
实例
输入:5 81 2 3 4 10
输出:2(用第三个账号重度宣传和第五个账号浅度宣传)
test3:有n个数,求每个数第一次全都是偶数的期望
实例
输入:21,2
输出:1/2 * 4 + 1/8 * 6 + 1/32 * 8 +... =(我忘了咋算了)好像是6

public static void test1(){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        double x = n;
        double res = 2 / (x * (x - 1));
        DecimalFormat decimalFormat = new DecimalFormat("#.##########");
        String format = decimalFormat.format(res);
        System.out.println(format);
    }
public static void  test2(){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int k = scanner.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = scanner.nextInt();
        }
        int[][] dp = new int[k + 1][2];
        for (int i = 0; i <= k ; i++) {
            dp[i][0] = Integer.MAX_VALUE;
            dp[i][1] = Integer.MAX_VALUE;
        }
        dp[0][0] = 0;
        dp[0][1] = 0;
        for (int i = 0; i < n; i++) {
            int act = nums[i] / 2;
            for (int j = k; j >= act ; j--) {
                if (dp[j - act][0] != Integer.MAX_VALUE){
                    dp[j][0] = Math.min(dp[j][0], dp[j - act][0] + 1);
                    dp[j][1] = Math.min(dp[j][1], dp[j - act][1] + 1);
                }
                if (j - nums[i] >= 0 && dp[j - nums[i]][0] != Integer.MAX_VALUE){
                    dp[j][1] = Math.min(dp[j][1], dp[j - nums[i]][0] + 1);
                }

            }
        }
        System.out.println(Math.min(dp[k][0], dp[k][1]));

    }

不知道对不对,是在考试后做的,题二是受@noodles:)老哥的提示。希望和大家一起讨论一下。
第三题不太会,有点思路但不多

评论 (2)