算法题

CF 553A Kyoya and Colored Balls

一个背包有K种颜色一共N个球,颜色分别为1,2,3…K,颜色相同的球是不区别的。现在从背包里一个一个拿球直到所有球拿光,在拿光第I+1种颜色球之前一定要拿光第I种颜色的球,求有多少种拿法

如果只有一种颜色的球,拿的方法只有一种。如果有两种,留下一个颜色为2的放在最后一个,剩下的N1个颜色1和N2-1个颜色2的可以随意摆,方法数为1*(N1+N2-1 choose N2-1);如果有三种相当于先排好颜色为1,2的,然后剩下N3-1个颜色为3的插空

代码

继续阅读

标准
算法题

POJ 2151 Check the difficulty of problems

有T个队伍M道题,给一个T*M的格子Pij表示第第i个队做出第j道题的概率,求每个队至少做出一道题,题数最多队至少做出N道题的概率

手算都算不出来…

这题可以用每个队都做出至少一题的概率P1减去每个队的出题数都在1~N-1的概率P2来算,P1的求法:1-每队都做不出题的概率相乘,dp[i][j][k]表示第i个队在前j道题中解出k道的概率,dp[i][j][k] = dp[i][j-1][k]*(1-p[i][j]) + dp[i][j-1][k-1]*p[i][j],dp[i][0][0] = 1.0。设s[i][j]表示第i个队做出j道题的概率,s[i][j] = dp[i][M][1] + dp[i][1][2] + … + dp[i][M][j] = (sum_{k=1}^j dp[i][M][k]),那么P2 = (s[1][N-1]-s[1][0])*(s[2][N-1]-s[2][0])*…*(s[T][N-1]-s[T][0]) ,P1 = (s[1][M]-s[1][0])*(s[2][M]-s[2][0])*…*(s[T][M]-s[T][0])

代码

继续阅读

标准
算法题

HDU 4638 Group

给出一段区间[L, R],并把这个区间分成M段,且每段中的数字必须是连续的(可以无序),每段的贡献为这段中数字个数的平方,如果使贡献最大,应该分成几段?

为了使贡献最大,应该使每个块尽量大。

用一个vis数组记录某个数字是否出现过,如果x-1,x+1都出现过,那么加入x的时候,块的个数-1;如果x-1,x+1都没出现过,那么加入x的时候,块的个数+1;如果x-1,x+1都出现过,那么删除x的时候,块的个数+1;如果x-1,x+1都没出现过,那么删除x的时候,块的个数-1;如果只出现一个,无论插入/删除,对块的数目没有影响

代码:

继续阅读

标准
算法题

莫队算法

莫队算法可以解决区间的静态查找问题,并且是一种离线算法。

如果可以在O(1)的时间复杂度下由[L, R]的答案得到[L, R+1], [L, R-1],[L+1, R],[L-1, R]的答案,那么就可以使用莫队算法。

莫队算法预先知道所有的提问,并按照一定顺序进行计算,能在O(n*sqrt(n))的时间复杂度内解决查询问题,并且几何意义为求二维平面上的一棵最小曼哈顿距离生成树。

由于最小曼哈顿距离生成树的变成复杂度太高,分块是一种很好的替代品。先按每个区间左端点在每个块中的位置排序,如果相同则按右端点排序。

标准