1. 程式人生 > >愛奇藝2018秋季Java筆試第二場 第三道程式設計題 牛牛和羊羊 求數學期望

愛奇藝2018秋季Java筆試第二場 第三道程式設計題 牛牛和羊羊 求數學期望

連結:https://www.nowcoder.com/questionTerminal/128d8d7d1898406b817fc69baa20602f
來源:牛客網

牛牛和羊羊非常無聊.他們有n + m個共同朋友,他們中有n個是無聊的,m個是不無聊的。每個小時牛牛和羊羊隨機選擇兩個不同的朋友A和B.(如果存在多種可能的pair(A, B),任意一個被選到的概率相同。),然後牛牛會和朋友A進行交談,羊羊會和朋友B進行交談。在交談之後,如果被選擇的朋友之前不是無聊會變得無聊。現在你需要計算讓所有朋友變得無聊所需要的時間的期望值。 
輸入描述:
輸入包括兩個整數n 和 m(1 ≤ n, m ≤ 50)


輸出描述:
輸出一個實數,表示需要時間的期望值,四捨五入保留一位小數。 示例1 輸入 2 1 輸出 1.5

【解決】考慮數學期望的求解
m=0,數學期望是0,不用交談。
m=1,用數學期望的累加,會一直加到無窮,如果m=1還好求解。

這裡寫圖片描述
因為數學期望推導有無窮個項的數列,對於m>1的情況,無法推匯出遞推公式。
考慮用動態規劃的方法求解。思路如下圖。
記dp(n,m)為(n,m)的數學期望,表示通過談話將(n,m)轉化為(n+m,0)的時間期望。
對於(n,m)這個狀態,如果再取一次對話,會有三種情況,(n,m),(n+1,m-1),(n+2,m-2)。
這裡有個理解的困難點,這裡求的是數學期望,很明顯能得出dp(n+1,m-1),dp(n+2, m-2)的數學期望是較小的,所以這裡的公式是要在dp(n+1,m-1)+1和dp(n+2,m-2)+1。
也可以這麼理解,dp(n,m)可以分成這三塊
一、dp(n,m) 概率是c1/s,
二、dp(n+1, m-1) 概率是c2/s
三、dp(n+2,m-2) 概率是c3/s
數學期望的計算公式是 各取值的可能性 * 概率 累加求和。這裡因為是多交談了一次,轉換而來的,說明dp(n,m)比累加求和要大1。
公式推導如下圖所示。
這裡寫圖片描述


注意,對於m>2的情況,陣列dp要初始化,dp[0]相當於是dp[n+m, 0],為0
dp[1]相當於是dp(n+m-1, 1),它的期望是m+n/2.0f

import java.util.Scanner;

/**
 * Created by Administrator on 2018/6/23 0023.
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int
n = scanner.nextInt(); int m = scanner.nextInt(); float[] dp = new float[m + 1]; if (m == 0) { System.out.println(0); return; } if (m == 1) { float res = (n + 1) / 2.0f; //和下面的不同,此處已知m=1 String r = String.format("%.1f", res); System.out.println(r); return; } dp[1] = (n+ m) / 2.0f; //注意此處 for (int i = 2; i <= m; i++) { dp[i] = p1(m + n-i, i) + p2(m + n -i, i) * (dp[i-1] + 1) + p3(m + n -i, i) * (dp[i-2] + 1); } String r = String.format("%.1f", dp[m]); System.out.println(r); } } private static float p1(int n, int m) { int c1 = n * (n-1) / 2; int s = (n + m) * (n + m -1) / 2; float res = c1 * 1.0f / (s - c1); return res; } private static float p2(int n, int m) { int c1 = n * (n-1) / 2; int c2 = n * m; int s = (n + m) * (n + m -1) / 2; float res = c2 * 1.0f / (s - c1); return res; } private static float p3(int n, int m) { int c1 = n * (n-1) / 2; int c3 = m * (m -1) / 2; int s = (n + m) * (n + m -1) / 2; float res = c3 * 1.0f / (s - c1); return res; } }

相關推薦

2018秋季Java筆試第二 程式設計 數學期望

連結:https://www.nowcoder.com/questionTerminal/128d8d7d1898406b817fc69baa20602f 來源:牛客網 牛牛和羊羊非常無聊.他們有n + m個共同朋友,他們中有n個是無聊的,m個是不無聊

2018秋季校招演算法工程師(第二)[程式設計]幸運子序列

連結:https://www.nowcoder.com/questionTerminal/872919272a33406a9c5ddc8b2f7532f4 來源:牛客網 牛牛得到一個長度為n的整數序列V,牛牛定義一段連續子序列的幸運值為這段子序列中最大值和次大值的異或值(次大值是嚴格的次大

2018秋季校招測試工程師(第一第二)程式設計彙總

做了下愛奇藝2018測試工程師的程式設計題,教開發工程師還是偏簡單,特意寫了個程式設計題合集。 題目連結: 第一場 第一題: 題目: 牛牛有一些排成一行的正方形。每個正方形已

2018秋季校招算法工程師(第一

空串 ring != push 所有 ios urn 需要 rmi 歡迎fork and star:Nowcoder-Repository-github 括號匹配深度 題目: 鏈接:https://www.nowcoder.com/questionTerminal/

2018秋季校招C++ [程式設計]奇異數

連結:https://www.nowcoder.com/questionTerminal/7442938f5012486499ddd61ce16f9086 來源:牛客網 如果一個數字滿足以下條件,我們就稱它為奇異數: 1、這個數字至少有兩位 2、這個數的最低兩位是相同的 比如: 1488是

2018秋季校招演算法工程師(第一)[程式設計]括號匹配深度

時間限制:1秒 空間限制:32768K 來源:牛客網 一個合法的括號匹配序列有以下定義: 1、空串""是一個合法的括號匹配序列 2、如果"X"和"Y"都是合法的括號匹配序列,"XY"也是一個合法的括號匹配序列 3、如果"X"是一個合法的括號匹配序列,那麼"(X)"也是一個合法的括號匹配序列 4、

2018.9.28筆試 散散的樹

題目描述 輸入: 5 20 4 42 40 26 46 輸出: 36 鋸子必須同時砍樹; 從樹頂到鋸子這段距離被砍下來當成木頭,從樹根到鋸子這段距離留下原地。 問鋸子最高可以多高,但其實要剛好使砍下來

2018年9月15日筆試程式設計題目AC程式碼

這幾天一直在關注著工作的事情,師兄們做筆試題,我也跟著在刷,包括華為,百度,騰訊,阿里等公司的筆試題都做了,基本上都幫助師兄拿到了面試的資格,但是因為密度太大,而自己還要整理leetcode的學習筆記,所以,很多題目沒有來得及整理,今天正好提前AC完成,就簡單分享一下愛奇藝的兩個題目。 第一個題

2018-09-15線上筆試】局長的食物

題目描述 局長的食物 時間限制:C/C++語言 1000MS;其他語言 3000MS 記憶體限制:C/C++語言 131072KB;其他語言 655360KB 題目描述: 局長有N種食物,每種

2018秋招C++ [程式設計]奶牛編號

連結:https://www.nowcoder.com/questionTerminal/b96da2bd7a574699b4ceaaa7819cf65b 來源:牛客網 牛牛養了n只奶牛, 牛牛想給每隻奶牛編號, 這樣就可以輕而易舉地分辨它們了。 每個奶牛對於數字都有自己的喜好, 第i只奶牛想要

2018秋招C++ [程式設計]紅

連結:https://www.nowcoder.com/questionTerminal/4ea618c551404efc8299c2eaac733329 來源:牛客網 牛牛有一些排成一行的正方形。每個正方形已經被染成紅色或者綠色。牛牛現在可以選擇任意一個正方形然後用這兩種顏色的任意一種進

2018年秋招

/** * 清雨又在吃自助餐了。 * * 排在清雨面前的有N種食物,排成一排,清雨可以選擇其中的若干種食物,   但是不能連續選擇相鄰的食物。因為清雨很挑食,當所有食物都不合口味時,   他可

面試Python,竟然掛在5輪……

今天給大家分享我曾經在愛奇藝的面試,過程還是比較有意思的,可以給大家一些參考 聊騷階段 嗲妹妹:你好,我是愛奇藝的HR,我們正在招聘運維開發崗位,請問您最近有在看工作機會嗎? 我:(這聲音也太酥了吧我去……)嗯,你好,訊號不太好,能在說下嗎?(讓我再酥一次吧) 嗲妹妹:(重複) 我:(我去,真的好酥啊)啊

吳恩達 DeepLearning 第二程式設計 tensorflow

TensorFlow Tutorial Welcome to this week's programming assignment. Until now, you've always used numpy to build neural networks. Now we will step yo

零基礎學Java語言(程式設計)

1奇偶個數(5分) 題目內容: 你的程式要讀入一系列正整數資料,輸入-1表示輸入結束,-1本身不是輸入的資料。程式輸出讀到的資料中的奇數和偶數的個數。 輸入格式: 一系列正整數,整數的範圍是(0,100000)。如果輸入-1則表示輸入結束。 輸出格式: 兩個整數,第一個整數表

今日頭條2018校園招聘後端開發工程師(批)程式設計

昨天做了下頭條的後端開發工程師的程式設計題,這編碼量大啊,兩個小時,三個程式設計題,一個改錯題,一個設計題,說實話,很考技術含量,而且程式設計題中有兩個還特別考細心編碼,如果兩個小時能做三個題,確實非常不錯了,寫下解題報告吧,根據自己截的圖和別人截的圖把題還原下

2018年華為實習生招聘程式設計

第一題:給定一個字串,輸出字串中連續最長的數字串,並把這個最長數字串的長度輸出來,中間以逗號(,)隔開。如果存在長度一樣的的連續數字串,返回最後一個連續數字串。樣例:abcd12345ed125ss123058789output:   123058789,9分析:新建兩個St

2018秋季社招java實習生面試題

題目: String a = new String("abc"); String b = new String("abc"); System.out.println(a.equals(b)); System.out.println(a== b); Strin

2018演算法崗位試卷第一

1  當分配給一個程序的頁面數增加時,頁故障數可能增大也可能變小,下述演算法符合這種情況的是(A) A FIFO演算法 B LRU演算法 C Clock演算法 D LFU演算法 解析: 此題的題意是:在頁面置換演算法中,哪一種演算法隨著給定頁面數的增加,缺頁中斷次

9.15 筆試程式設計

局長的食物 #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib