传送门

题意

给出一张图,LL从一个点等概率走到上下左右位置,询问LL从宿舍走到餐厅的步数期望

分析

该题是一道高斯消元+期望的题目

难点在于构造矩阵,我们发现以下结论

设某点走到餐厅的期望为Ek

1.当该点为餐厅,Ek=0

2.\(Ek=\sum_{i=1}^{cnt}Enexti-1\)

我们先BFS将可达点标号,再构建矩阵,再高斯消元,最后A[vis[sx][sy]][id]为所求解

trick

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int M = 202;
  4. const double eps = 1e-8;
  5. int equ, var;
  6. double a[M][M], x[M];
  7. void Gauss ()
  8. {
  9. int i, j, k, col, max_r;
  10. for (k = 0, col = 0; k < equ && col < var; k++, col++)
  11. {
  12. max_r = k;
  13. for (i = k+1; i < equ; i++)if (fabs (a[i][col]) > fabs (a[max_r][col])) max_r = i;
  14. if (k != max_r)
  15. {
  16. for (j = col; j < var; j++)swap (a[k][j], a[max_r][j]);
  17. swap (x[k], x[max_r]);
  18. }
  19. for (j = col+1; j < var; j++) a[k][j] /= a[k][col]; x[k] /= a[k][col];
  20. a[k][col] = 1;
  21. for (i = 0; i < equ; i++) if (i != k)
  22. {
  23. x[i] -= x[k] * a[i][k];
  24. for (j = col+1; j < var; j++) a[i][j] -= a[k][j] * a[i][col];
  25. a[i][col] = 0;
  26. }
  27. }
  28. }
  29. //has[x]表示人在x点时的变量号,因为我们只用可达状态建立方程,所以需要编号
  30. int has[M], vis[M], id, e, n, m;
  31. double p[M], sum;
  32. int bfs (int u)
  33. {
  34. memset (has, -1, sizeof(has));
  35. memset (a, 0, sizeof(a)); //忘记初始化WA勒,以后得注意
  36. memset (vis, 0, sizeof(vis));
  37. int v, i, flag = 0;id=0;
  38. queue<int> q;
  39. q.push (u);
  40. has[u] = id++;
  41. while (!q.empty ())
  42. {
  43. u = q.front ();q.pop ();
  44. if (vis[u]) continue;
  45. vis[u] = 1;
  46. if (u == e || u == n-e) //终点有两个,你懂的~
  47. {
  48. a[has[u]][has[u]] = 1;
  49. x[has[u]] = 0;
  50. flag = 1;
  51. continue;
  52. }
  53. //E[x] = sum ((E[x+i]+i) * p[i])
  54. // ----> E[x] - sum(p[i]*E[x+i]) = sum(i*p[i])
  55. a[has[u]][has[u]] = 1;x[has[u]] = sum;
  56. for (i = 1; i <= m; i++)if(fabs(p[i])>eps)
  57. {
  58. //非常重要!概率为0,该状态可能无法到达,如果还去访问并建立方程会导致无解
  59. v = (u + i) % n;
  60. if (has[v] == -1) has[v] = id++;
  61. a[has[u]][has[v]] -= p[i];
  62. q.push (v);
  63. }
  64. }
  65. return flag;
  66. }
  67. int main()
  68. {
  69. int t, s, d, i;
  70. for(scanf("%d",&t);t--;)
  71. {
  72. scanf ("%d%d%d%d%d", &n, &m, &e, &s, &d);
  73. n = 2*(n-1);sum = 0;
  74. for (i = 1; i <= m; i++)
  75. {
  76. scanf ("%lf", p+i);
  77. p[i] = p[i] / 100;
  78. sum += p[i] * i;
  79. }
  80. if (s == e){puts ("0.00");continue;}
  81. //一开始向左,起点要变
  82. if (d > 0) s = (n - s) % n;
  83. if (!bfs (s)){puts ("Impossible !");continue;}
  84. equ = var = id;
  85. Gauss ();
  86. printf ("%.2f\n", x[has[s]]);
  87. }
  88. return 0;
  89. }

HDU2262;Where is the canteen(高斯消元+期望)的更多相关文章

  1. BZOJ 3143 HNOI2013 游走 高斯消元 期望

    这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 不过笔者在做完后发现了一些问题,在原文的后面进行了说明. 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号 ...

  2. BZOJ_3270_博物馆_(高斯消元+期望动态规划+矩阵)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3270 \(n\)个房间,刚开始两个人分别在\(a,b\),每分钟在第\(i\)个房间有\(p[ ...

  3. BZOJ 2337 XOR和路径 | 高斯消元 期望 位运算

    BZOJ 2337 XOR和路径 题解 这道题和游走那道题很像,但又不是完全相同. 因为异或,所以我们考虑拆位,分别考虑每一位: 设x[u]是从点u出发.到达点n时这一位异或和是1的概率. 对于所有这 ...

  4. BZOJ 2707: [SDOI2012]走迷宫 拓扑+高斯消元+期望概率dp+Tarjan

    先Tarjan缩点 强连通分量里用高斯消元外面直接转移 注意删掉终点出边和拓扑 #include<cstdio> #include<cstring> #include<a ...

  5. 【BZOJ2707】[SDOI2012]走迷宫 Tarjan+拓扑排序+高斯消元+期望

    [BZOJ2707][SDOI2012]走迷宫 Description Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,M ...

  6. 洛谷P3232 [HNOI2013]游走(高斯消元+期望)

    传送门 所以说我讨厌数学……期望不会高斯消元也不会……好不容易抄好了高斯消元板子被精度卡成琪露诺了…… 首先,我们先算出走每一条边的期望次数,那么为了最小化期望,就让大的期望次数乘上小编号 边的期望次 ...

  7. HDU4418:Time travel(高斯消元+期望)

    传送门 题意 一个人在数轴上来回走,以pi的概率走i步i∈[1, m],给定n(数轴长度),m,e(终点),s(起点),d(方向),求从s走到e经过的点数期望 分析 设E[x]是人从x走到e经过点数的 ...

  8. [luogu3232 HNOI2013] 游走 (高斯消元 期望)

    传送门 题目描述 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等 ...

  9. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡(高斯消元+期望dp)

    传送门 解题思路 设\(f(x)\)表示到\(x\)这个点的期望次数,那么转移方程为\(f(x)=\sum\frac{f(u)*(1 - \frac{p}{q})}{deg(u)}\),其中\(u\) ...

随机推荐

  1. Delphi:解决重绘造成的窗体闪烁问题

    解决窗体闪烁问题 具体代码: 1.在声明窗体类时加入:   private     procedure CreateParams(var Params: TCreateParams); overrid ...

  2. IT桔子 - 千里马俱乐部

    IT桔子 - 千里马俱乐部 浙江

  3. python解析xml文件之xml.etree.cElementTree和xml.etree.ElementTree区别和基本使用

    1.解析速度:ElementTree在 Python 标准库中有两种实现.一种是纯 Python 实现例如 xml.etree.ElementTree ,另外一种是速度快一点的 xml.etree.c ...

  4. InfluxDB useful commands

    InfluxDB 配置文件地址:/etc/influxdb/influxdb.conf 通过curl写数据 curl -i -XPOST 'http://localhost:8086/write?db ...

  5. topcoder srm 550

    div1 250pt: 题意:有个机器人,从某一点出发,他只有碰到地形边缘或者碰到走过的点时才会改变运动方向,然后接着走,现在给出他的运动轨迹,判断他的运动是否合法,如果合法的话,那么整个地形的最小面 ...

  6. android 多进程 Binder AIDL Service

    本文參考http://blog.csdn.net/saintswordsman/article/details/5130947 android的多进程是通过Binder来实现的,一个类,继承了Bind ...

  7. serverSpeed是一个android手机端到服务器间udp/tcp对比测速软件

    https://github.com/eltld/serverSpeed https://github.com/c-wind/serverSpeed https://github.com/PeterK ...

  8. Linq To Entities中的动态排序

    换了工作有一个月了,一样的工作.一样的代码.一样的体力活仍就…… Linq To Entityes 也是不新玩意了,近半年来也一直与之打交道,但一直也没对其深究过.今天新加的功能要对所有列支持排序,这 ...

  9. 【扩展知识2】函数strlen()和非函数sizeof的使用

    [扩展知识2]函数strlen()和非函数sizeof的使用 [扩展文件夹] strlen函数 sizeof ( 1 )函数strlen() 原型:size_tstrlen ( const char ...

  10. #include &quot;*.c&quot;文件的妙用

    今天我在看代码的时候突然看到在一个.c文件里包括了#include "*.c"代码,这个让我非常诧异,然后google了一下.才发现是这么回事情.以下我写了一个測试代码.我相信你看 ...