BZOJ4117 : [Wf2015]Weather Report
一种天气情况的概率只与4种天气的出现次数有关,故将相同概率的情况计数后放入堆中模拟哈夫曼树即可。
每次取出概率最小的,将它个数除以2,对于零头需要特判。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include<cstdio> #include<queue> #define N 22 using namespace std; typedef long long ll; typedef pair< double ,ll>P; int n,i,j,k,l;ll c[N][N]; double A,B,C,D,pa[N],pb[N],pc[N],pd[N],ans; priority_queue<P,vector<P>,greater<P> >q; int main(){ scanf ( "%d%lf%lf%lf%lf" ,&n,&A,&B,&C,&D); for (c[0][0]=i=1;i<=n;i++) for (c[i][0]=j=1;j<=i;j++)c[i][j]=c[i-1][j-1]+c[i-1][j]; for (pa[0]=pb[0]=pc[0]=pd[0]=1,i=1;i<=n;i++){ pa[i]=pa[i-1]*A; pb[i]=pb[i-1]*B; pc[i]=pc[i-1]*C; pd[i]=pd[i-1]*D; } for (i=0;i<=n;i++) for (j=0;j<=n;j++) for (k=0;k<=n;k++) for (l=0;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 (1){ P t=q.top();q.pop(); if (q.empty()&&t.second==1) break ; if (t.second>1){ if (t.second&1)q.push(P(t.first,1)),t.second--; ans+=t.first*t.second; q.push(P(t.first*2,t.second>>1)); } else { P u=q.top();q.pop(); ans+=t.first+u.first; q.push(P(t.first+u.first,1)); if (u.second>1)q.push(P(u.first,u.second-1)); } } return printf ( "%.6f" ,ans),0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术