题目大意:求解题目的第二个公式。
解题思路:直接求解第二个公式,只需注意下为0的时候,值为0即可,详见code。
题目来源:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5359
code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int eps = 1e-9;
const int MAXN = 100+10;
const int M = 5;
int t,n,d;
double p[MAXN];
char str[M];
int main(){
//freopen("input.txt","r",stdin);
scanf("%d",&t);
while(t--){
double ans=0;
scanf("%d %s",&n,str);
for(int i=0;i<n;++i){
scanf("%d",&d);
p[i]=d*1.0/100;
}
if(str[0]=='b'){
for(int i=0;i<n;++i){
if(p[i]==0) continue;
ans-=p[i]*log2l(p[i]+eps);
}
}
if(str[0]=='n'){
for(int i=0;i<n;++i){
if(p[i]==0) continue;
ans-=p[i]*logl(p[i]+eps);
}
}
if(str[0]=='d'){
for(int i=0;i<n;++i){
if(p[i]==0) continue;
ans-=p[i]*log10l(p[i]+eps);
}
}
printf("%.11f\n",ans);
}
return 0;
}