洛谷-P2911 [USACO08OCT]Bovine Bones G

洛谷-P2911 [USACO08OCT]Bovine Bones G

原题链接:https://www.luogu.com.cn/problem/P2911


题目描述

贝茜喜欢玩棋盘游戏和角色扮演游戏,所以她说服了约翰开车带她去小商店.在那里她买了三个骰子。这三个不同的骰子的面数分别为 (s_1,s_2,s_3)

对于一个有 (S) 个面的骰子每个面上的数字是 (1,2,3,ldots,S)。每个面(上的数字)出现的概率均等。贝茜希望找出在所有“三个面上的数字的和”中,哪个和的值出现的概率最大。

现在给出每个骰子的面数,需要求出哪个所有“三个面上的数字的和”出现得最频繁。如果有很多个和出现的概率相同,那么只需要输出最小的那个。

数据范围: (2le s_1leq 20)(2 leq s_2leq 20)(2 leq s_3leq 40)

输入格式

第1行:三个以空格分隔的整数:S1,S2和S3。

输出格式

第1行:以每种可能的组合掷骰子时出现频率最高的最小整数和。

输入输出样例

输入 #1

3 2 3 

输出 #1

5 

说明/提示

Here are all the possible outcomes.

1 1 1 -> 3  
1 2 1 -> 4  
2 1 1 -> 4  
2 2 1 -> 5  
3 1 1 -> 5  
3 2 1 -> 6 
1 1 2 -> 4  
1 2 2 -> 5  
2 1 2 -> 5  
2 2 2 -> 6  
3 1 2 -> 6  
3 2 2 -> 7 
1 1 3 -> 5  
1 2 3 -> 6  
2 1 3 -> 6  
2 2 3 -> 7  
3 1 3 -> 7  
3 2 3 -> 8

Both 5 and 6 appear most frequently (five times each), so 5 is the answer.

C++代码

#include <iostream>
using namespace std;

int main() {
    int s1, s2, s3, ans=3;
    cin >> s1 >> s2 >> s3;
    int a[s1+s2+s3+1] = {0};
    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];
    for (int i=4; i<=s1+s2+s3; ++i)
        if (a[ans] < a[i])
            ans = i;
    cout << ans << endl;
    return 0;
}
原文地址:https://www.cnblogs.com/yuzec/p/13364297.html