题解 P3802 【小魔女帕琪】
题目链接
众所周知,帕琪有哮喘和贫血,不可能连续咏唱7个魔法,所以输出0.000即可
公式的推导已经有dalao分析得很详细了,这里就着重讲一下写代码时的一些注意事项和部分执行语句的用法
主要思想:概率/期望
本题公式:7! (a1/n) [ a2/(n-1)) ] [a3/(n-2)] [a4/(n-3)] [a5/(n-4)] [a6/(n-5)] * a7
注意事项:
1、输入输出格式:注意到输出要求“一个四舍五入保留3位的浮点数”,对于这种格式,c++中最便捷的语句就是scanf和printf,用法如下:
①读入域宽为n(即n位)的整数a: scanf("%nd",&a);(取前n位)(若不加域宽则读到空格/换行为止)
②读入域宽为n(即n个字符)的字符串ch: scanf("%nc",&ch)(若不加域宽则读入单个字符)
③输出域宽为n的整数a: printf("%nd",a);(左端补空格,若位数大于n则出错)或 printf("%0nd",a);(左端补0)(若不加域宽则输出原数字)
④输出保留小数点后n位(四舍五入)的浮点数d:printf("%.nlf",d);(若不加n则保留小数点后6位)
上面没有列举的用法可能会出错,比如scanf("%.3lf",&d),一般不建议这么用,当然自己试一下是理解执行语句最好的方法
应用举例:scanf("%1d",&a[i]) ;读入一位整数
例题: P1451 求细胞数量
2、数据类型兼容:由于ai是整数而输出要求浮点数,有的oier会在转换数据类型上浪费时间,然而不同数据类型并不是那么“泾渭分明”,以下用a>b表示类型a可以兼容/代替类型b:
double > int
double > float
long long > long > int > short
unsigned long long > | long long |
其中double和float所占用的空间不会对总空间产生太大影响,而double的精度高于float,即float能过的double一定能过,但double能过的float不一定能过(比如本题),所以一般浮点数直接用double;而long long和int由于占用空间差距较大,能用int就尽量不用long long
3、特殊数据处理:对于首尾数据需要特殊处理的,不用在循环中加入特判,直接拎出循环即可(如本题a[7]),可使代码更简洁精炼
4、运算过程中的数据范围:以本题为例,应该有不少人会把分子分母分别相乘再做除法,然而Πai最大可达到10^63,显然会导致溢出,其他题目亦是如此,一定要先预判数据范围,避免在细节上丢分
5、头文件的选择:即使有便捷的万能头文件,还是应该对常用头文件有一定的了解,如<cmath>主要包含max、min、sqrt、pow等,<cstring>主要包含对字符串进行操作的函数,<iostream>主要包含cin、cout等,<algorithm>主要包含sort等stl函数,特别注意<cmath>中y1为关键字;本题没有使用特殊函数,只需<cstdio>即可
最后是AC代码:
#include<cstdio>
using namespace std;
double ans=1,arr[10];
int main(){
for(int i=1;i<=7;++i){
scanf("%lf",&arr[i]);
arr[0]+=arr[i];
}
for(int i=1;i<=7;++i) printf("%lf\n",arr[i]);
for(int i=1;i<=6;++i){
ans*=arr[i]/(arr[0]+1-i)*i;
}
ans*=arr[7]*7;
printf("%.3lf",ans);
return 0;
}
欢迎来我的blog看看