Hướng dẫn giải của Bedao Mini Contest 22 - Điểm và Xác suất


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Tác giả: khai99

Giả sử ta cố định được ~j_1~, ~j_2~, ~j_3~, ~j_4~, ~j_5~ lần lượt là điểm mà Trung đạt được ở các bài kiểm tra từ ~1~ đến ~5~, ta có công thức tính điểm trung bình ~D~ và xác suất ~P~ (tỉ lệ Trung đạt được các điểm thành phần) như sau:

$$D = \left \lceil \dfrac{j_1 + j_2 + j_3 + j_4 + j_5}{5} \right \rceil$$

$$P = \dfrac{p_{1,j_1} \times p_{2, j_2} \times p_{3, j_3} \times p_{4, j_4} \times p_{5, j_5}}{100^5}$$

Như vậy, với mỗi bộ ~(j_1, j_2, j_3, j_4, j_5)~, ta có thể tính được điểm trung bình tạo bởi ~5~ điểm thành phần đó và xác suất Trung đạt được bộ điểm như vậy. Khi này, tỉ lệ Trung đạt được điểm ~D~ sẽ tăng thêm ~P~ đơn vị.

Từ đó, ta có thể suy ra được hướng giải như sau:

  • Xây dựng 5 vòng for lồng nhau, vòng for thứ ~i~ sẽ duyệt qua các giá trị ~j_i~ trong khoảng ~[0, 10]~. Ta cũng có thể sử dụng đệ quy cho bước này.
    • Với mỗi bộ năm ~(j_1, j_2, j_3, j_4, j_5)~ như thế, tính giá trị ~D~ và ~P~ tương ứng với bộ năm đó, và cập nhật mảng ~ans[]~ theo công thức: ~ans[D] = ans[D] + P~.
    • Sau khi kết thúc quá trình duyệt, ta đi lần lượt các con điểm từ ~0~ đến ~10~ và xuất ra ~ans[i]~ chính là xác suất Trung đạt được điểm ~i~ theo yêu cầu đề bài. Lưu ý, vì đề bài yêu cầu ta xuất ra tỉ lệ dưới đơn vị phần trăm, nên ta cần phải biến đổi ~ans[i]~ từ dạng tỉ lệ thuần sang dạng tỉ lệ phần trăm bằng cách ~ans[i] = ans[i] \times 100~.

Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 1
    ithero  đã bình luận lúc 23, Tháng 11, 2023, 12:23

    Sao mình code như này lại sai được nhỉ?

    for (int j1 = 0; j1 < 11; j1++)
    for (int j2 = 0; j2 < 11; j2++)
    for (int j3 = 0; j3 < 11; j3++)
    for (int j4 = 0; j4 < 11; j4++)
    for (int j5 = 0; j5 < 11; j5++) {
        int d = (j1 + j2 + j3 + j4 + j5) / 5;
        double p = (a[0][j1] * a[1][j2] * a[2][j3] * a[3][j4] * a[4][j5]) / 1e10;
        ans[d] = ans[d] + p;
    }
    for (int i = 0; i < 11; i++)
        cout << fixed << setprecision(10) << ans[i] * 100 << " ";
    

    • 4
      QioCass  đã bình luận lúc 28, Tháng 11, 2023, 17:02

      Đề bảo là điểm trung bình phải làm tròn lên.

      Bạn có thể sửa thành là int d = ceil(1.0 * (j1 + j2 + j3 + j4 + j5) / 5);


      • 1
        ngunhatdtt  đã bình luận lúc 30, Tháng 11, 2023, 5:18

        em cam on ngai a


    • -3
      OrzSeaPosjtive  đã bình luận lúc 23, Tháng 11, 2023, 13:15