HDU 1410 PK武林盟主【组合数+log优化】
2017-01-31 16:12
387 查看
PK武林盟主
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1438 Accepted Submission(s): 375
Problem Description
枫之羽认为自己很强,想当武林盟主,于是找现任武林盟主氢氧化铜挑战。氢氧化铜欣然接受了挑战,两人约好于下个月的月圆之夜在HDU校园内的三根柱子上进行决战。这场PK赛肯定能吸引武林中所有人前来观战,所以他们找了有商业运作潜力的经济人你,让你来组织这场百年一见的世纪之战,假设两人都有一定的血HP1、HP2.HP1是枫之羽的,HP2是氢氧化铜的。他们也有一定攻击力AP1、AP2,AP1是枫之羽的,AP2是氢氧化铜的。当进行攻击时,对方的HP减少自己的攻击力,比如HP1=2 HP2=1 AP1=1 AP2=1,当氢氧化铜攻击枫之羽时,枫之羽的HP=2(原先的HP1)-1(氢氧化铜的AP2)=1。现在两个人对决很多回合,每回合不是枫之羽攻击氢氧化铜,就是氢氧化铜攻击枫之羽。求枫之羽能赢氢氧化铜成为下任武林盟主的的胜率。
Input
该题含有多组测试数据,每行为HP1,HP2,AP1和AP2 (1<=HP1,HP2,AP1,AP2<=32767)
Output
每组数据输出一行,为枫之羽赢氢氧化铜概率的值 (结果保留4位小数).
Sample Input
2 1 1 1
Sample Output
75.0000
A能打B a=(hp2/ap1+!!(hp2%ap1))下;
B能打A b=(hp1/ap2+!!(hp1%ap2))下;
如果A胜,则B必然被打b下,A则可被打0~(a-1)下
A 被打N下 且B被打死(最后一下一定是A打B)的概率为 C(b+N-1,N)*pow(0.5,b+N);
所以A胜的概率为 sum[C(b+i-1,i)*pow(0.5,b+i)] 0<=i<a;复杂度O(n^2) .
又C(b+i-1,i) = C(b+i-1-1,i-1)*(b+i-1)/i;
所以 用 temp*=(b+i-1)/i 累乘的方式计算出各级C(b+i-1,i);
因为乘的太多, double精度会丢失,所以用log10()优化一下
temp += log10(b+i-1)-log10(i);【因为log(a+b)=loga+logb ,所以变为加号】
ans+=pow(10,temp)*pow(0.5,b+i) = pow(10,temp+(b+i)*log(0.5));
注:当a=0时,C(b,0)=0,所以初始temp=1,经过log优化后,temp=log10(1)
#include<cstdio> #include<math.h> #include<cstring> #include<climits> #include<string> #include<queue> #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<climits> #include<string> #include<queue> #include<stack> #include<set> #include<map> #include<algorithm> using namespace std; #define rep(i,j,k)for(i=j;i<k;i++) #define per(i,j,k)for(i=j;i>k;i--) #define MS(x,y)memset(x,y,sizeof(x)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define ll long long #define abs(x) (x>0?x:-x) const int INF=0x7ffffff; int hp1,hp2,ap1,ap2; int a,b; int i,j,k,n,m; double temp,ans; int main() { while(~scanf("%d%d%d%d",&hp1,&hp2,&ap1,&ap2)){ a=hp1/ap2+!!(hp1%ap2); b=hp2/ap1+!!(hp2%ap1); temp=log10(1); ans=pow(0.5,b); for(i=1;i<a;i++){ temp+=log10((b+i-1)*1.0)-log10(i*1.0); ans+=pow(10,temp+(b+i)*log10(0.5)); } printf("%.4lf\n",ans*100.0); } return 0; }
相关文章推荐
- HDU 1410 PK武林盟主
- [简单DP] COJ 1123 PK武林盟主
- hdu 4465 求期望(C(m,n)太大用log优化)
- Pk武林盟主(C++)
- hdu 4465 求期望(C(m,n)太大用log优化)
- HDU1410-PK武林盟主
- hdu 1410PK武林盟主
- 组合计数中的隔板法 HDU 1410 PK武林盟主
- [ACM_HDU_1410]PK武林盟主
- 一场武林盟主争霸赛-观察者模式PK委托事件技术
- hdu 2085 核反应堆组合数学
- HDU 1107 武林
- HDU 3506 Monkey Party 【DP+四边形不等式优化】
- hdu 1568 (log取对数 / Fib数通项公式)
- HDU 1521 排列组合
- 组合枚举方法与常见优化
- HDU-1203 I NEED A OFFER!-0、1背包及空间优化
- HDU1171 单调队列优化多重背包O(VN)
- hdu 1394 Minimum Inversion Number(优化版)
- acm.hdu.edu.cn-1107武林采用小型项目式解决方案