「专题训练」Collecting Bugs(POJ-2096)

题意与分析

题意大致是这样的:给定一个\(n\times s\)的矩阵,每次可以随机的在这个矩阵内给一个格子染色(染过色的仍然可能被选中),问每一行和每一列都有格子被染色的次数的期望。
这题如果从概率(从正方向推)就会白给,不信你自己试试;而定义反方向的推导(\(e_{i,j}\)意为从i行j列已有染色格子到最后全被染色的次数的期望)就会非常简单:分四种情况讨论即可。

代码

#include <bits/stdc++.h>
using namespace std;

double e[1005][1005];

int n, s;
const double eps = 1e-6;

int main() {
  while (cin >> n >> s) {
    memset(e, 0, sizeof(e));
    for (int x = n; x >= 0; --x) {
      for (int y = s; y >= 0; --y) {
        double p1 = x * y, p2 = (n - x) * y, p3 = x * (s - y),
               p4 = (n - x) * (s - y);
        if (x == n && y == s)
          e[x][y] = 0;
        else {
          e[x][y] = (p2 * e[x + 1][y] + p3 * e[x][y + 1] +
                     p4 * e[x + 1][y + 1] + n * s) /
                    (n * s - p1);
        }
      }
    }
    cout << fixed << setprecision(4) << e[0][0] << endl;
  }
  return 0;
}

原文地址:https://www.cnblogs.com/samhx/p/poj-2096.html

时间: 2024-07-30 14:03:36

「专题训练」Collecting Bugs(POJ-2096)的相关文章

「专题总结」LCT 2

差不多理解板子之后,写了一些奇怪的题. 但是还是那个问题:树剖真好使. 魔法森林:mikufun说这个是傻逼题. 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐士. 魔法森林可以被看成一个包含n个节点m条边的无向图,节点标号为1-n,边标号为1-m. 初始时小 E 同学在号节点 ,隐士则住在n号节点.小 E 需要通过这一片魔法森林,才能够拜访到隐士. 魔法森林中居住了一些妖怪.每当有人经过一条边的时候,这条边上的妖怪就会对其发起攻击. 幸运的是,在1号节点住着两种守护精灵:

「专题总结」回文自动机PAM

为了备课,把做完的专题的总结咕了这么久... 主要是自己做题做的太慢了,所以讲SAM的时候准备也不充分. 在把讲课时间不断咕之后依然是粗制滥造,锅很多,所以效果很差.而且还有人没听懂... 一半人都做了5道题以上了,另一半人还没怎么看,基本所有人都有预习. 得不到任何反馈,也不知道速度如何.就当凑活吧. 挺失败的.可能也没有下一次机会了. 我也不知道后缀数组推荐率是怎么达到100%的...那次我讲的自己也很满意 一到难的知识点我就不行了嘛...主要是自己理解也很不深刻 至少也还是在3个多小时之内

「专题总结」线性基

为什么要把毫无关联的线性基和群论放在一个专题里呢..? 因为它们都很毒瘤 线性基本身还是比较简单的,用于处理一些数子集异或和的集合有哪些. 然而它的考察方法总是很神奇... 题目难度大致升序,但是没有前置知识关系: 元素: $Description:$ 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石. 一般地,矿石越多则法力越强,但物极必反:有时,人们为了获取更强的法力而使用了很多矿石,却在炼制

「专题总结」半平面交(6/8completed)

还是题都没做完就来写一部分题解了,因为最近很忙(其实是效率太低),所以可能一时半会回不来这个专题. 为了防止什么都没剩下忘干净,于是乎瞎写个题解记录一下... 还是一如既往的不擅长集合. 刚开始我看到半平面交我还以为是用来解决三维计算几何问题的,吓一跳. 半平面不用多说,就是一条直线把一个二维平面分成两半,其中的一半. 半平面交其实很好理解,就是同一个二维平面中若干个半平面相交的部分. 维护的方法其实挺草率的,和凸包有不少互通的地方,只不过因为封闭所以是双端队列. 凸包偏向于点,半平面交偏向于线

「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)

题意与分析(CodeForces 540D) 代码 #include <iomanip> #include <iostream> #include <cstring> #include <algorithm> #include <vector> #define MP make_pair #define PB push_back #define fi first #define se second #define ZERO(x) memset((x

「日常训练」School Marks(Codeforces Round 301 Div.2 B)

题意与分析(CodeForces 540B) 代码 #include <iostream> #include <cstring> #include <algorithm> #include <vector> #define MP make_pair #define PB push_back #define fi first #define se second #define ZERO(x) memset((x), 0, sizeof(x)) #define

「日常训练」Ice Cave(Codeforces Round 301 Div.2 C)

题意与分析(CodeForces 540C) 这题坑惨了我....我和一道经典的bfs题混淆了,这题比那题简单. 那题大概是这样的,一个冰塔,第一次踩某块会碎,第二次踩碎的会掉落.然后求可行解. 但是这题...是冰塔的一层 也就是说,它只是个稍微有点限制的二维迷宫问题. 后面就好理解了,不过需要考虑下这种数据: 1 2 XX 1 1 1 1 这种数据答案是no.解决的方法可以考虑这样:分成两个数组来记录访问状态:vis数组和block数组. 代码 #include <queue> #inclu

「日常训练」Paths and Trees(Codeforces Round 301 Div.2 E)

题意与分析 代码 #include <bits/stdc++.h> #define MP make_pair #define PB emplace_back #define fi first #define se second #define ZERO(x) memset((x), 0, sizeof(x)) #define ALL(x) (x).begin(),(x).end() #define rep(i, a, b) for (repType i = (a); i <= (b);

「日常训练」Woodcutters(Codeforces Round 303 Div.2 C)

这题惨遭被卡..卡了一个小时,太真实了. 题意与分析 (Codeforces 545C) 题意:给定\(n\)棵树,在\(x\)位置,高为\(h\),然后可以左倒右倒,然后倒下去会占据\([x-h,x]\)或者\([x,x+h]\)区间,如果不砍伐,占据\([x,x]\)区域. 问你最多砍多少棵树,砍树的条件是倒下去后占有的区间不能被其他树占据. 分析:在这条题目的条件下,这是一个傻逼贪心题.(然后我读错两次题目,怎么也想不出来贪心策略....) 很简单的策略:能往左倒往左倒,能往右倒往右倒.因