Hdu 5810 Balls and Boxes
链接
题意
有n个球,m个盒子,每个球扔进每个盒子是等概率的,
$V=\frac{\sum_{i=1}^{m}(X_{i}-\bar X)^{2}}{m}$
求V的期望值,其中Xi是第i个盒子的球数
分析
数学公式推导,answer=n*(m-1)/(m*m)
参考代码
1 | #include<stdio.h> |
Hdu Elegant Construction
链接
题意
有n个城镇,给定每个城镇能到达的城镇数(可直接或间接到达),
问是否能建一些没有环路的单向路,满足上述条件
分析
将顶点按能到达的点数从小到大排序,排好序之后每个点只能往前面的点连边.
因而如果存在一个排在第i位的点,要求到达的点数大于i-1,则不可行;
否则就可以按照上述方法构造出图. 复杂度O(N^2).
参考代码
1 | #include<stdio.h> |
Hdu 5816 Hearthstone
链接
题意
有n张奥术智慧(抽两张牌),m张火球术(造成x点伤害),
给定每张火球术会造成的伤害数以及对手的HP数,
求这回合杀死对手的概率是多少。
分析
设dp[i][j][k]表示有i张火球术,用j张火球打出伤害为k的方案数,可以先DP求出。
转移方程为:dp[i][j][k]=dp[i-1][j][k]+dp[i-1][j-1][k-x[i]]
其中x[i]是第i张火球的伤害,相当于恰好装满的01背包。可以优化为二维空间。
设s[i]表示有m张火球术,用i张火球打出伤害大于等于P(敌方血量)的总方案数。
则用i张火球打出杀死对手的概率pi=s[i]/com[m][i](com是组合数)
再用位运算求出枚举牌库的状态(m+n位,其中有m个1),状态总数为cnt,
对于每中状态可计算出能抽到的火球牌数i,计算概率总和,answer=sum(pi)/cnt
参考代码
1 | #include<stdio.h> |
Hdu 5818 Joint Stacks
链接
题意
有两个栈A,B(初始时为空),有三种操作:
push(插入一个数)、pop(删除栈顶元素)、merge.
其中merge是按照A,B中元素进栈的相对顺序来重排的.
pop操作时,输出删除的元素值。
分析
比较简单巧妙的一个做法是引入一个新的栈C,每次合并的时候就把A和B合并到C上,然后把A和B都清空. push还是按正常做,pop注意当遇到要pop的栈为空时,因为题目保证不会对空栈进行pop操作,所以这时应直接改为对C栈进行pop操作. 这样做因为保证每个元素最多只在一次合并中被处理到,pop和push操作当然也是每个元素只做一次,所以总复杂度是O(N)的.
参考代码
1 | #include<stdio.h> |