Link:

BZOJ 4117 传送门

Solution:

第一次写$Huffman Tree$相关,发现就是个合并果子?

此题可以将每一种情况的概率和排列总数算出,接下来就是按照$Haffman Tree$基本构造方式操作了

注意,这里使用了分治的思想:

(1)如果排列总数大于1,先排除奇数影响,再将$P(pro,num)$变为$P(pro*2,num/2)$,

相当于将排列拆成相等的两部分再合并到一起

(2)如果排列总数等于1,再取下一个 概率最小的方式中的一个排列 合并即可

这样将排列方式不断减半、到一再合并的方法方便了概率的叠加

(Question:存疑点,为什么不能按照$pro*num$从小到大排序直接进行合并呢?)

Code:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<double,ll> P;
#define X first
#define Y second
const int MAXN=;
int n;ll c[MAXN][MAXN];
double A,B,C,D,pa[MAXN],pb[MAXN],pc[MAXN],pd[MAXN],res;
priority_queue<P,vector<P>,greater<P> > q; int main()
{
c[][]=;
for(int i=;i<=;i++)
{
c[i][]=;
for(int j=;j<=;j++)
c[i][j]=c[i-][j]+c[i-][j-];
} scanf("%d%lf%lf%lf%lf",&n,&A,&B,&C,&D);
pa[]=pb[]=pc[]=pd[]=1.0; //预处理
for(int i=;i<=n;i++)
pa[i]=pa[i-]*A,pb[i]=pb[i-]*B,pc[i]=pc[i-]*C,pd[i]=pd[i-]*D;
for(int i=;i<=n;i++) for(int j=;j<=n;j++)
for(int k=;k<=n;k++) for(int l=;l<=n;l++)
if(i+j+k+l==n) q.push(P(pa[i]*pb[j]*pc[k]*pd[l],c[n][i]*c[n-i][j]*c[n-i-j][k])); while(true)
{
P cur=q.top();q.pop();
if(q.empty() && cur.Y==) break;
if (cur.Y>) //拆分+合并
{
if(cur.Y&) q.push(P(cur.X,)),cur.Y--;
res+=cur.X*cur.Y;
q.push(P(cur.X*,cur.Y>>));
}
else //合并
{
P t=q.top();q.pop();
res+=cur.X+t.X;
q.push(P(cur.X+t.X,));
if(t.Y>) q.push(P(t.X,t.Y-));
}
}
printf("%.6f",res);
return ;
}

[BZOJ 4117] Weather Report的更多相关文章

  1. BZOJ4117 : [Wf2015]Weather Report

    一种天气情况的概率只与4种天气的出现次数有关,故将相同概率的情况计数后放入堆中模拟哈夫曼树即可. 每次取出概率最小的,将它个数除以2,对于零头需要特判. #include<cstdio> ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. (转) Artificial intelligence, revealed

    Artificial intelligence, revealed Yann LeCunJoaquin Quiñonero Candela It's 8:00 am on a Tuesday morn ...

  4. 浅谈Excel开发:七 Excel 自定义任务窗体

    前面花了三篇文章讲解了Excel中的UDF函数,RTD函数和异步UDF函数,这些都是Excel开发中的重中之重.本文现在开始接着第二篇文章的菜单系统开始讲解Excel中可供开发的界面元素,本文要讲解的 ...

  5. 在Gradle中使用jaxb的xjc插件

    jaxb,全称为Java Architecture for Xml Binding,是一种将java对象与xml建立起映射的技术.其主要提供两个功能,一是将java对象映射为xml,二是将xml映射为 ...

  6. java 调用webservice接口

    webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使 ...

  7. ZeroMQ 教程 001 : 基本概览

    介绍性的话我这里就不翻译了, 总结起来就是zmq很cool, 你应该尝试一下. 如何安装与使用zmq 在Linux和Mac OS上, 请通过随机附带的包管理软件, 或者home brew安装zmq. ...

  8. https Java SSL Exception protocol_version

    在java代码中,使用HttpClient爬取https页面时,遇到了这个bug:javax.net.ssl.SSLException: Received fatal alert: protocol_ ...

  9. 使用axis2的wsdl2java把wsdl生成java文件

    原文地址:http://blog.csdn.net/walkcode/article/details/7661674 有时在我们的开发中可能会有这种情况就是你要使用webservice但是对方没有给你 ...

随机推荐

  1. [HEOI2017]分手是祝愿 期望概率dp 差分

    经分析可知:I.操作每个灯可看做一种异或状态 II.每个状态可看做是一些异或状态的异或和,而且每个异或状态只能由它本身释放或放入 III.每一种异或状态只有存在不存在两中可行状态,因此这些灯只有同时处 ...

  2. BZOJ3236: [Ahoi2013]作业 树状数组维护 莫队

    水果~~~~ 关于四个while可行性的证明:区间有正确性所以不管那团小东西用没有duang~反它最终总会由于两次覆盖二准确 关于区间种数可行性的证明:他会在0 1间(或两边)来回跳动(过程中),最终 ...

  3. 理解[].forEach.call()

    例子: let cols = document.querySelectorAll('ul li') [].forEach.call(cols, function (col, index) { // T ...

  4. MySQL使用笔记(六)条件数据记录查询

    By francis_hao    Dec 17,2016 条件数据记录查询 mysql> select field1,field2-- from table_name where 条件; 其中 ...

  5. python3初识selenium

    第一步:安装与配置 1.电脑上需要有火狐浏览器(默认安装在C:\Program Files (x86)\Mozilla Firefox目录下). 2.使用pip install selenium安装好 ...

  6. 停止ambari上服务的顺序

    Before performing any upgrades or uninstalling software, stop all of the Hadoop services in the foll ...

  7. Ubuntu系统iptables规则的查看和清除

    系统不支持service iptables restart,service iptables status,如何查看与清除iptable的规则呢? 一 iptables查看基本语法 iptables ...

  8. HTML5学习之新增标签

    转自:http://www.cnblogs.com/fly_dragon/archive/2012/05/25/2516142.html 作者:FlyDragon 一.引言 在本节中,笔者将向大家讲述 ...

  9. DotNETCore 学习笔记 日志

    Logging --------------------------------------------------------------------------------------- Impl ...

  10. java servlet输出数据

    httpServletResponse.setContentType("text/html;charset=UTF-8"); httpServletResponse.getWrit ...