LigthOJ1284-Lights inside 3D Grid

来源:互联网 发布:JavaScript this 编辑:程序博客网 时间:2024/06/12 01:20

题意:在一个长宽高为XYZ的长方体中所有的灯都是关着的,一次操作为任选两个格子,以这两个格子为顶点的长方体所包括的所有格子上的灯状态都会改变,关的会被打开,开的会被关掉,给定XYZ的值,现在进行K次操作,问开着的灯的期望个数

思路:求出每个格子经过K次操作后灯是开着的期望值,然后把所有的格子的期望值加起来就是总期望值

对于每个格子,把XYZ的值分开考虑,因为XYZ是分别独立的,如果在一次操作中这个格子的灯状态改变了,那么选中的两个顶点一定在这个格子的两边,否则这个格子不会被选到的长方体覆盖到,设该点坐标为(x0,y0,z0),那么满足x1<=x0<=x2,y1<=y0<=y2,z1<=z0<=z2,

所以该点被覆盖的概率P=( 2*(x0+1)*(X-x0) - 1 ) * ( 2*(y0+1)*(Y-y0) - 1 ) * ( 2*(z0+1)*(Z-z0) - 1 ) / ( X*X*Y*Y*Z*Z )

    因为灯的初始状态是关,所以被操作奇数次的格子灯的状态为开,所以在k次操作中,事件发生奇数次的期望E

这是二项展开式( p + (1-p) ) ^ k = 1 的奇数项,令 ( -p + (1-p) ) ^ k,则E  = (1 - ( -p + (1-p) ) ^ k) / 2.

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <vector>#include <queue>using namespace std;int main () {int t;scanf ( "%d", &t );for ( int cas = 1; cas <= t; cas++ ) {int X,Y,Z,k;scanf ( "%d%d%d%d", &X, &Y, &Z, &k );double ans = 0.0;double all = 1.0*X*X*Y*Y*Z*Z;for ( int x = 0; x < X; x++ ) {for ( int y = 0; y < Y; y++ ) {for ( int z = 0; z < Z; z++ ) {double p = (2.0 * (x+1) * (X-x) - 1) * (2.0 * (y+1) * (Y-y) - 1) * (2.0 * (z+1) * (Z-z) - 1) / all;double temp = ( 1 - pow(1-2*p,1.0*k) ) / 2.0;ans += temp;}}}printf ( "Case %d: %lf\n", cas, ans );}return 0;}


0 0
原创粉丝点击