CDOJ 1330 柱爷与远古法阵(高斯消元)

柱爷与远古法阵

Time Limit: 125/125MS (Java/Others)     Memory Limit: 240000/240000KB (Java/Others)
Submit Status

众所周知,柱爷的数学非常好,尤其擅长概率论!

某日柱爷在喵哈哈村散步,无意间踏入了远古法阵!

法阵很奇怪,是一个长度为NN的走廊,初始时柱爷在最左边,现在柱爷要到最右边去!

柱爷的行动方式如下:

  • 每个回合柱爷会投一次骰子,根据骰子上的点数每个回合柱爷会投一次骰子,根据骰子上的点数X,柱爷会相应的往右边移动,柱爷会相应的往右边移动X步.步.

  • 骰子的数值是骰子的数值是1到到6,取到每面的概率相同,取到每面的概率相同

  • 在某些位置可能有传送门,一旦柱爷在该回合结束后在这个位置上,会被强制传送到传送门的另外一边在某些位置可能有传送门,一旦柱爷在该回合结束后在这个位置上,会被强制传送到传送门的另外一边

  • 传送门是单向的,同时每个位置不会有超过1个传送门,同时不会存在a→b,b→c这种情况传送门是单向的,同时每个位置不会有超过1个传送门,同时不会存在a→b,b→c这种情况

  • 在任意时刻柱爷都必须保证在法阵内,也就说如果在这一回合结束后柱爷的位置在法阵外,那么这回合柱爷将什么都不做在任意时刻柱爷都必须保证在法阵内,也就说如果在这一回合结束后柱爷的位置在法阵外,那么这回合柱爷将什么都不做

那么请问柱爷到达最右边的期望回合数是多少呢?或者是永远都无法到达?

Input

第一行两个整数NN,MM,分别表示法阵的长度和传送门的数量

接下来MM行,每行两个整数uu,vv,表示从uu到vv有一扇传送门

数据保证:

  • 1≤N≤3001≤N≤300

  • 0≤M≤[N−22]0≤M≤[N−22]

  • 1<u<N,1≤v≤N,u≠v1<u<N,1≤v≤N,u≠v

Output

输出仅一行,表示期望的回合数,如果永远不能到达,输出−1−1.

答案误差在10−610−6以内将被忽略

Sample input and output

Sample Input Sample Output
100 0
33.0476190476
100 2
2 3
99 100
29.8571428571

Hint

你可能需要一些概率论 & 线性代数的知识才能解决本题!

Source

2016 UESTC Training for Dynamic Programming

 #include <bits/stdc++.h>
using namespace std;
const int maxn=;
const long double eps=1e-;
long double a[maxn][maxn];//构造的高斯消元的矩阵,代表第i个方程式的第j个系数是多少 ,精度要求很高
int n,m,f[maxn],x,y;
inline int read()//读入优化
{
int x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-')
f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
inline void write(int x)//输出优化
{
if(x<)
{
putchar('-');
x=-x;
}
if(x>)
write(x/);
putchar(x%+'');
}
int main()
{
n=read();
m=read();
for(int i=;i<=n;i++)
f[i]=i;
for(int i=;i<=m;i++)//如果有传送的话,到哪里
f[read()]=read();
//建立增广矩阵的过程
for(int i=;i<n;i++)
{
a[i][i]=;//第一个方程
if(f[i]!=i)
a[i][f[i]]=-;//如果有传送门 系数直接抵消 x-y=0 相当于 x=y
else
{
a[i][n+]=;//方程右边的常数
for(int j=;j<=;j++)
{
if(i+j<=n)
a[i][i+j]-=1.0;
else
a[i][i]-=1.0;//另外一个方程
}
}
}
a[n][n]=1.0;//最后的方程
a[n][n+]=;
//高斯消元的过程
for(int i=;i<=n;i++)
{
int p=i;
for(int j=i+;j<=n;j++)
{
if(fabs(a[j][i])>eps)//向下查找第j个系数不为0的方程
p=j;
}
if(fabs(a[p][i])>eps)
{
for(int j=i;j<=n+;j++)
swap(a[i][j],a[p][j]);//把方程移上来
for(int j=i+;j<=n;j++)//向下消元 同时除去其他的系数
{
if(fabs(a[j][i])>eps)
{
long double k=a[j][i]/a[i][i];//消元
for(int t=i;t<=n+;t++)
a[j][t]-=a[i][t]*k;//系数相减
}
}
}
}
//回代过程
for(int i=n;i>=;i--)
{
for(int j=i+;j<=n;j++)
{
if(fabs(a[i][j])>eps)
a[i][n+]-=a[i][j]*a[j][n+];//用已知的解求未知解
}
if(abs(a[i][i])<=eps&&abs(a[i][n+])>eps)//如果出现矛盾
{
printf("-1\n");
return ;
}
a[i][n+]/=a[i][i];//求出当前的解
}
printf("%.12lf\n",(double)a[][n+]);//a[i][n+1]就是第i个未知数的解
return ;
}
这个算法和之前谈及的有点儿不同,它由绝对值最大的部分开始做起,这样可以改善算法上的稳定性。将经过调换后的第一列作为起点,这算法由左至右地计算。每作出以下两个步骤,才跳到下一列:
1.定出每列的最后一个非0的数,将每行的数字除以该数,使到每行的第一个数成为1;
2.将每行的数字减去第一行的第一个数的某个倍数。
所有步骤完成后,这个矩阵会变成一个行梯阵式,再用代入法就可解决这个方程组。
线性方程组其实是相当容易解决的,基本的思想就是消元。但是当未知数较多时,解起来也蛮头疼的。在这里向大家介绍高斯消元法。例如解如下四元一次方程组:
除去各未知数,将各数排在一起,成为矩阵:
为方便起见,用r2+r1表示把第一行各数加到第二行对应数上。
r2-2*r1, r3-3*r1, r4-4*r1,r3+4*r2, r4+3*r2,r4-2*r3, 可得:
化为方程组形式则为:
从而,可得:
X4=4
X3=3
X2=2
X1=1.
说明:对于矩阵采取的变换的合理性,可对照相应方程组的变换加以理解。

参考:CDOJ 1330 柱爷与远古法阵【高斯消元,卡精度】 - Angel_Kitty - 博客园
https://www.cnblogs.com/ECJTUACM-873284962/p/7016987.html

CDOJ 1330 柱爷与远古法阵(高斯消元)的更多相关文章

  1. CDOJ 1330 柱爷与远古法阵【高斯消元,卡精度】

    柱爷与远古法阵 Time Limit: 125/125MS (Java/Others)     Memory Limit: 240000/240000KB (Java/Others) Submit S ...

  2. UESTC 1330 柱爷与远古法阵【高斯消元】

    题目链接[http://acm.uestc.edu.cn/#/problem/show/1330] 题意:有一个长度为L(L <= 300)的长廊,有一人站在最左边,他要到最右边去,他每次可以走 ...

  3. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

  4. 【BZOJ-3270】博物馆 高斯消元 + 概率期望

    3270: 博物馆 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 292  Solved: 158[Submit][Status][Discuss] ...

  5. *POJ 1222 高斯消元

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9612   Accepted: 62 ...

  6. [bzoj1013][JSOI2008][球形空间产生器sphere] (高斯消元)

    Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧 ...

  7. hihoCoder 1196 高斯消元·二

    Description 一个黑白网格,点一次会改变这个以及与其连通的其他方格的颜色,求最少点击次数使得所有全部变成黑色. Sol 高斯消元解异或方程组. 先建立一个方程组. \(x_i\) 表示这个点 ...

  8. BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基

    [题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...

  9. SPOJ HIGH Highways ——Matrix-Tree定理 高斯消元

    [题目分析] Matrix-Tree定理+高斯消元 求矩阵行列式的值,就可以得到生成树的个数. 至于证明,可以去看Vflea King(炸树狂魔)的博客 [代码] #include <cmath ...

随机推荐

  1. CodeFrist基础_Fluent Api

    一丶首先新建两个实体类 public class Student { public int StudentKey { get; set; } public string StudentName { g ...

  2. [C++] 化学方程式的格式化算法

    网上普遍使用的化学方程式的格式普遍如下 例: KMnO4+FeSO4+H2SO4=Fe2(SO4)3+MnSO4+K2SO4+H2O 要把化学方程式格式化,单单一个正则表达式是非常反人类的,故可选用 ...

  3. db2 group by的疑惑。

    按借据号分组,显示每组的条数:

  4. python3连接mysql 稍微进阶 + 日期处理

    1.踩了个操作中文的坑,结果发现之前的文章中有强调了,在连接处加:charset="utf8" conn = pymysql.connect(host = '127.0.0.1', ...

  5. Django-REST-Framework JWT 实现SSO认证(上)

    一.什么是Django-REST-Framework? Django-REST-framework 是基于Django框架的一个web RESTful风格开发的框架,它可以实现API接口的快速开发,但 ...

  6. kvm virsh命令详解

    [root@ok home]# virsh list Id Name State ---------------------------------------------------- 1 13sv ...

  7. 带你全面分析嵌入式linux系统启动过程中uboot的作用

    资料链接:http://mp.weixin.qq.com/s/rYVchD-xy7Bdkc1O3fW2Wg

  8. Codeforces Round #232 (Div. 2) C

    C. On Number of Decompositions into Multipliers time limit per test 1 second memory limit per test 2 ...

  9. BAT、网易、京东等如何做大数据风控的?

    大数据风控目前应该是前沿技术在金融领域的最成熟应用,相对于智能投顾.区块链等还在初期的金融科技应用,大数据风控目前已经在业界逐步普及,从BATJ这样的大企业,到交易规模比较大的网贷平台,再到做现金贷. ...

  10. 分享一个灰常好的 dapper 扩展插件: Rainbow

    dapper 是一个效率非常高的orm  框架 ,效率要远远大于 我们大微软的EF .    它只有一个类文件,非常之小.(在 EF 5.0 后 微软已经做了 改进) ps; 由于之前我也没测试过,只 ...