题解:洛谷 P2911 [USACO08OCT] Bovine Bones G

【题目来源】

洛谷:P2911 [USACO08OCT] Bovine Bones G - 洛谷

【题目描述】

Bessie 喜欢桌游和角色扮演游戏,所以她说服了 Farmer John 驾车送她去爱好商店,在那里她购买了三个用于掷骰子的骰子。这些公平的骰子分别有 \(S_1\)\(S_2\)\(S_3\) 个面(\(2 \leq S_1 \leq 20\)\(2 \leq S_2 \leq 20\)\(2 \leq S_3 \leq 40\)),上面分别包含 \(1\)\(S_1\)\(S_2\)\(S_3\) 之间的所有整数。Bessie 不断地掷骰子,试图找出哪个三个骰子的点数和出现得最频繁。如果有多个和出现得最频繁,输出其中最小的和。

【输入】

第 1 行:三个用空格分隔的整数:\(S_1\)\(S_2\)\(S_3\)

【输出】

第 1 行:当骰子以每种可能的组合掷出时,出现次数最多的最小整数和。

【输入样例】

3 2 3

【输出样例】

5

【解题思路】

image

【算法标签】

《洛谷 P2911 Bovine Bones》 #枚举# #期望# #USACO# #2008#

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
using namespace std;      // 使用标准命名空间

int main()
{
    int s1, s2, s3;      // 定义变量:三个骰子的面数
    int a[85] = {0};     // 定义数组:统计各点数出现的次数(初始化为0)
  
    cin >> s1 >> s2 >> s3;  // 输入三个骰子的面数
  
    // 三重循环遍历所有可能的骰子组合
    for (int i = 1; i <= s1; i++) 
    {
        for (int j = 1; j <= s2; j++) 
        {
            for (int k = 1; k <= s3; k++) 
            {
                a[i + j + k]++;  // 统计当前点数出现的次数
            }
        }
    }
  
    // 初始化最大值和结果(最小可能的点数是3)
    int max = a[3];      // 当前最大出现次数
    int ans = 3;         // 对应的点数
  
    // 遍历所有可能的点数(从3到s1+s2+s3)
    for (int i = 3; i <= s1 + s2 + s3; i++) 
    {
        // 如果当前点数出现次数更多,则更新最大值和结果
        if (a[i] > max) 
        {
            max = a[i];  // 更新最大出现次数
            ans = i;     // 更新结果点数
        }
    }
  
    cout << ans;         // 输出出现次数最多的点数
  
    return 0;            // 程序正常结束
}

【运行结果】

3 2 3
5
posted @ 2026-02-16 15:47  团爸讲算法  阅读(1)  评论(0)    收藏  举报