手机买球

hiho一下第319周《元素魔法》题目分析

1
0

TBD本题是一道数学题
手机买球 容易证明当x1:x2:x3...:xk=a1:a2:a3...:ak时,结果最大。

所以xi = a * ai / sum(ai)

带入即可求得最大值。

2 answer(s)

0

手机买球但是不知道为什么,我的程序能输出正确结果,但是系统判定我的程序只得50分,贴出来请大家指教。

#include <iostream>
#include <vector>
#include <cmath>
#include <iomanip>
using namespace std;

int main()
{
    int k;
    cin>>k;
    double a;
    cin>>a;
    vector<double> w(k);
    double sum_w=0.0;

    for(int i=0;i<k;i++)
    {
        cin>>w[i];
        sum_w+=w[i];
    }
    vector<double> x(k);
    double max_output=1.0;
    for(int i=0;i<k;i++)
    {
        x[i]=w[i]/sum_w*a;
        max_output*=pow(x[i],w[i]);
    }
    cout<<setiosflags(ios::fixed)<<setprecision(5)<<log(max_output)<<endl;
    for(int i=0;i<k;i++)
        cout<<setiosflags(ios::fixed)<<setprecision(5)<<x[i]<<' ';
    cout<<endl;
}
  • 连乘积很容易超数据类型范围,建议用对数求和运算修饰一下

  • 添加评论
  • reply
0

这题很简单,当xi的分布与wi分布相同时,输出的威力是最大的。 简言之,对给定的求得威力的公式取对数,即可发现结果是wi与log(xi)的卷积,等价于分布wi与分布xi的KL散度,当两个分布相同时,结果取极值。

write answer 切换为英文 切换为中文


转发分享

bet366线上买球188bet手机版客户端bet820bet36在线开户