题解:P2911 [USACO08OCT] Bovine Bones G

· · 题解

简单的枚举题

题目内容

Bessie买了三个骰子分别有 S_1S_2S_3 个面(2 \le S_1 \le 20,2 \le S_2 \le 20,2 \le S_3 \le 40)。她不断掷骰子,要找出三个骰子的和出现得最频繁的那个(如果有多个和出现的频率相同,则输出其中最小的和)。

分析

枚举三个骰子所有可能的组合的和,统计每个和出现的次数。然后找出出现次数最多的和,如果有多个一样的就选最小的那个。这里我用了一个 he 数组记录每个和出现的次数,最后遍历 he 数组,打擂找到出现次数最多的和。

代码

#include<bits/stdc++.h>
using namespace std;
int s1,s2,s3,he[16005],maxn=-INT_MAX;
int maxx=-INT_MAX,h;
int main(){
    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++){//标记所有和出现次数。 
                he[i+j+k]++;
                maxn=max(maxn,i+k+j);
            }
        }
    }

    for(int i=1;i<=maxn;i++){//遍历所有可能的和,找到出现次数最多的最小的和。 
        if(he[i]>maxx){
            maxx=he[i];
            h=i;//用 h 记录最小的和。
        }
    }
    cout<<h;
    return 0;
}