http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3827
直接划水就好了。
三种方法,计算三种logn。
比赛的时候没看懂题,,队友写的。。。
不太清楚eps是干嘛的
自己补的。
#include <bits/stdc++.h>
using namespace std;
/*线段树主要应用于下列情况
1 区间查询
*/
const int maxn=2000;
int main()
{ int t;
int a[maxn];
int n;
string s;
double sum=0;
scanf("%d",&t);
while(t--){
cin>>n;
cin>>s;
sum=0;
for(int i=0;i<n;i++){
cin>>a[i];
sum+=a[i];
}
double ans=0;
if(s=="bit")
for(int i=0;i<n;i++){
//if(!a[i]) continue;
ans+=-(a[i]*1.0/sum*1.0)*log2((a[i]*1.0)/sum*1.0);
}
else if(s=="nat")
for(int i=0;i<n;i++){
if(!a[i]) continue;
ans+=-(a[i]*1.0/sum*1.0)*log((a[i]*1.0)/sum*1.0);
}
else if(s=="dit")
for(int i=0;i<n;i++){
if(!a[i]) continue;
ans+=-(a[i]*1.0/sum*1.0)*log10((a[i]*1.0)/sum*1.0);
}
printf("%.12f\n",ans);
}
return 0;
}
队友写的
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define E 2.718281828459
#define EPS 1e-12
#include <map>
using namespace std;
map<string,double>mp;
double a[105];
int main()
{
mp["bit"]=2;
mp["nat"]=E;
mp["dit"]=10;
mp["digit"]=10;
int t;
scanf("%d",&t);
while(t--)
{
int n;
string str;
scanf("%d",&n);
cin>>str;
double b=mp[str];
//cout<<"b="<<b<<endl;
double sum=0;
if(b==E)
{
for(int i=0;i<n;i++)
{
scanf("%lf",&a[i]);
a[i]/=100;
if(a[i]!=0)
sum-=a[i]*log(a[i]);
else sum-=EPS*log(EPS);
}
}
else if(b==10)
{
for(int i=0;i<n;i++)
{
scanf("%lf",&a[i]);
a[i]/=100;
if(a[i]!=0)
sum-=a[i]*log10(a[i]);
else sum-=EPS*log10(EPS);
}
}
else if(b==2)
{
for(int i=0;i<n;i++)
{
scanf("%lf",&a[i]);
a[i]/=100;
if(a[i]!=0)
sum-=a[i]*log(a[i])/log(b);
else sum-=EPS*log(EPS)/log(b);
}
}
printf("%.12lf\n",sum);
}
return 0;
}