【题目描述】
【题目大意】
其实本身题目只需穷举一下,题目意思如下:
三个骰子.这三个不同的骰子的面数分别为s1 s2 s3
对于一个有S个面的骰子每个面上的数字是1,2,3,...,S.每个面(上的数字)出现的概率均等.贝茜希望找出在所有“三个面上的数字的和”中,哪个和的值出现的概率最大.
现在给出每个骰子的面数,需要求出哪个所有“三个面上的数字的和”出现得最频繁.如果有很多个和出现的概率相同,那么只需要输出最小的那个.
【思路】
1.三个数,直接上三重循环,因为数据范围很小
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int k=1;k<=l;k++){
......
}
}
}
2.定义一个数组,重复将a[i+j+k]++;
a[i+j+k]++;//插入到上面的三重循环中
3.最后,一个·for循环用Max比较出现次数,记住是求序号,不是求值
int Max=0;
int id=0;
for(int i=1;i<=100005;i++){
if(Max<a[i]){
Max=a[i];
id=i;
}
}
cout<<id;
【完整代码】
那么,很容易就得到了代码
#include<bits/stdc++.h>
using namespace std;
long long a[100005];//注意数组要开到n+m+L的大小哦
int main(){
int n,m,l;
scanf("%d%d%d",&n,&m,&l);//输入三个数
//枚举骰子的可能点数
//累加可能的情况
for(int i=1;i<=n;i++){//三重循环枚举(数据量较小)
for(int j=1;j<=m;j++){
for(int k=1;k<=l;k++){
a[i+j+k]++;
}
}
}
long long Max=-1000;
int id=1;
for(int i=1;i<=10005;i++){
if(Max<a[i]){//求最大值,注意,建议不要用max函数,因为要统计序号
Max=a[i];
id=i;
}
}
printf("%lld",id);//输出id
return 0;
}
写作不易,请给个小红心支持支持吧!!!