[ACM] hdu 4418 Time travel (高斯消元求期望)
Time travel

Agent K is one of the greatest agents in a secret organization called Men in Black. Once he needs to finish a mission by traveling through time with the Time machine. The Time machine can take agent K to some point (0 to n-1) on the timeline and when he gets
to the end of the time line he will come back (For example, there are 4 time points, agent K will go in this way 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, ...). But when agent K gets into the Time machine he finds it has broken, which make the Time machine can't
stop (Damn it!). Fortunately, the time machine may get recovery and stop for a few minutes when agent K arrives at a time point, if the time point he just arrive is his destination, he'll go and finish his mission, or the Time machine will break again. The
Time machine has probability Pk% to recover after passing k time points and k can be no more than M. We guarantee the sum of Pk is 100 (Sum(Pk) (1 <= k <= M)==100). Now we know agent K will appear at the point X(D is the direction of the Time machine: 0 represents
going from the start of the timeline to the end, on the contrary 1 represents going from the end. If x is the start or the end point of the time line D will be -1. Agent K want to know the expectation of the amount of the time point he need to pass before
he arrive at the point Y to finish his mission.
If finishing his mission is impossible output "Impossible !" (no quotes )instead.
If finishing his mission is impossible output one line "Impossible !"
(no quotes )instead.
2
4 2 0 1 0
50 50
4 1 0 2 1
100
8.14
2.00
解题思路:
转自:http://972169909-qq-com.iteye.com/blog/1689107
题意:一个人在数轴上来回走。以pi的概率走i步i∈[1, m]。给定n(数轴长度)。m。e(终点),s(起点),d(方向)。求从s走到e经过的点数期望
解析:设E[x]是人从x走到e经过点数的期望值,显然对于终点有:E[e] = 0
一般的:E[x] = sum((E[x+i]+i) * p[i])(i∈[1, m])
(走i步经过i个点,所以是E[x+i]+i)
建立模型:高斯消元每一个变量都是一个互不同样的独立的状态,因为人站在一个点,另一个状态是方向!比如人站在x点。有两种状态向前、向后,不能都当成一种状态建立方程,所以要把两个方向化为一个方向从而使状态不受方向的影响
实现:
n个点翻过去(除了头尾两个点~~~)变为2*(n-1)个点,比如:
6个点:012345 ---> 0123454321
那么显然,从5開始向右走事实上就是相当于往回走
然后方向就由两个状态转化成一个状态的,然后每一个点就是仅仅有一种状态了,对每一个点建立方程高斯消元就可以
状态转移有E[x]=sum((E[x+i]+i)*p[i])
即 E[x]=sum(E[x+i]*p[i]) + sum(i*p[i])
即E[x]-E[x+1]*p[1]-E[x+2]*p[2]-.........-E[x+m]*p[m]=sum(i*p[i])
代码:
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <iomanip>
#include <queue>
#include <cmath>
using namespace std;
const double eps=1e-9;
double p[110];
bool vis[220];
int n,m,x,y,d;
double a[220][220];
int equ,var;//equ个方程,var个变量
double xi[220];//解集
bool free_x[220]; int sgn(double x)
{
return (x>eps)-(x<-eps);
} bool bfs()
{
memset(vis,0,sizeof(vis));
vis[x]=true;
queue<int>q;
q.push(x);
while(!q.empty())
{
int first=q.front();
q.pop();
for(int i=1;i<=m;i++)
{
int temp=(first+i)%n;
if(p[i]>=eps&&!vis[temp])
{
vis[temp]=true;
q.push(temp);
}
} }
if(vis[y]||vis[(n-y)%n])
return true;
return false;
} void create()
{
double sum=0;
for(int i=1;i<=m;i++)
sum+=p[i]*i;
memset(a,0,sizeof(a));
for(int i=0;i<n;i++)
{
a[i][i]=1;
if(!vis[i])
continue;
if(i==y||i==(n-y)%n)
{
a[i][n]=0;
continue;
}
a[i][n]=sum;
for(int j=1;j<=m;++j)
{
a[i][(i+j)%n]-=p[j];//一定不能写成a[i][(i+j)%n]=-p[j];//由于同一个点可能到达两次或多次。系数要叠加,切记! !!
}
}
} int gauss()
{
equ=n,var=n;
int i,j,k;
int max_r; // 当前这列绝对值最大的行.
int col; // 当前处理的列.
double temp;
int free_x_num;
int free_index;
// 转换为阶梯阵.
col=0; // 当前处理的列.
memset(free_x,true,sizeof(free_x));
for(k=0;k<equ&&col<var;k++,col++)
{
max_r=k;
for(i=k+1;i<equ;i++)
{
if(sgn(fabs(a[i][col])-fabs(a[max_r][col]))>0)
max_r=i;
}
if(max_r!=k)
{ // 与第k行交换.
for(j=k;j<var+1;j++)
swap(a[k][j],a[max_r][j]);
}
if(sgn(a[k][col])==0)
{ // 说明该col列第k行下面全是0了,则处理当前行的下一列.
k--; continue;
}
for(i=k+1;i<equ;i++)
{ // 枚举要删去的行.
if (sgn(a[i][col])!=0)
{
temp=a[i][col]/a[k][col];
for(j=col;j<var+1;j++)
{
a[i][j]=a[i][j]-a[k][j]*temp;
}
}
}
} for(i=k;i<equ;i++)
{
if (sgn(a[i][col])!=0)
return 0;
}
if(k<var)
{
for(i=k-1;i>=0;i--)
{
free_x_num=0;
for(j=0;j<var;j++)
{
if (sgn(a[i][j])!=0&&free_x[j])
free_x_num++,free_index=j;
}
if(free_x_num>1) continue;
temp=a[i][var];
for(j=0;j<var;j++)
{
if(sgn(a[i][j])!=0&&j!=free_index)
temp-=a[i][j]*xi[j];
}
xi[free_index]=temp/a[i][free_index];
free_x[free_index]=0;
}
return var-k;
} for (i=var-1;i>=0;i--)
{
temp=a[i][var];
for(j=i+1;j<var;j++)
{
if(sgn(a[i][j])!=0)
temp-=a[i][j]*xi[j];
}
xi[i]=temp/a[i][i];
}
return 1;
} int main()
{
int t;cin>>t;
while(t--)
{
cin>>n>>m>>y>>x>>d;
double temp;
for(int i=1;i<=m;i++)
{
cin>>temp;
p[i]=temp/100;
}
if(x==y)
{
cout<<"0.00"<<endl;
continue;
}
n=(n-1)*2;
if(d>0)
x=(n-x)%n;
if(!bfs())
{
cout<<"Impossible !"<<endl;
continue;
}
create();
if(!gauss())
cout<<"Impossible !"<<endl;
else
cout<<setiosflags(ios::fixed)<<setprecision(2)<<xi[x]<<endl;
}
return 0;
}
[ACM] hdu 4418 Time travel (高斯消元求期望)的更多相关文章
- hdu 4870 rating(高斯消元求期望)
Rating Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU4870_Rating_双号从零单排_高斯消元求期望
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4870 原题: Rating Time Limit: 10000/5000 MS (Java/Other ...
- hdu 4418 高斯消元求期望
Time travel Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 3992 AC自动机上的高斯消元求期望
Crazy Typewriter Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 2262 高斯消元求期望
Where is the canteen Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- HDU 5833 (2016大学生网络预选赛) Zhu and 772002(高斯消元求齐次方程的秩)
网络预选赛的题目……比赛的时候没有做上,确实是没啥思路,只知道肯定是整数分解,然后乘起来素数的幂肯定是偶数,然后就不知道该怎么办了… 最后题目要求输出方案数,首先根据题目应该能写出如下齐次方程(从别人 ...
- 高斯消元与期望DP
高斯消元可以解决一系列DP序混乱的无向图上(期望)DP DP序 DP序是一道DP的所有状态的一个排列,使状态x所需的所有前置状态都位于状态x前: (通俗的说,在一个状态转移方程中‘=’左侧的状态应该在 ...
- 【BZOJ2137】submultiple 高斯消元求伯努利数
[BZOJ2137]submultiple Description 设函数g(N)表示N的约数个数.现在给出一个数M,求出所有M的约数x的g(x)的K次方和. Input 第一行输入N,K.N表示M由 ...
- SPOJ HIGH(生成树计数,高斯消元求行列式)
HIGH - Highways no tags In some countries building highways takes a lot of time... Maybe that's bec ...
随机推荐
- 数据层交换和高性能并发处理(开源ETL大数据治理工具--KETTLE使用及二次开发 )
ETL是什么?为什么要使用ETL?KETTLE是什么?为什么要学KETTLE? ETL是数据的抽取清洗转换加载的过程,是数据进入数据仓库进行大数据分析的载入过程,目前流行的数据进入仓库的 ...
- Codeforces Round #270--B. Design Tutorial: Learn from Life
Design Tutorial: Learn from Life time limit per test 1 second memory limit per test 256 megabytes in ...
- Swift - 字符串(String)用法详解
下面对String常用的属性和方法做个总结 1,判断是否为空:isEmpty 1 2 3 var str:String if str.isEmpty{ } 2,获取字符数量:countElements ...
- JSP的学习(5)——语法知识三之include指令
本篇继续来对JSP语法中的JSP指令进行学习,在<JSP的学习(3)——语法知识二之page指令>中,已经介绍了JSP指令的书写格式和page指令的详细信息,所以在这一篇中我们会对JSP指 ...
- Android 高手进阶,自己定义圆形进度条
背景介绍 在Android 开发中,我们常常遇到各种各样绚丽的控件,所以,依靠我们Android本身所带的控件是远远不够的,许多时候须要我们自定义控件,在开发的过程中.我们公司遇到了一种须要自己写的一 ...
- 我在知乎上关于Laser200/310电脑的文章。
我是30年前从Laser-310起步的,我来回答这个问题. 主要硬件规格: CPU:Z-80A/4.7MHz主频 16K RAM + 2K Video RAM 16K ROM 磁带输出:波特率300 ...
- 不同数据库oracle mysql SQL Server DB2 infomix sybase分页查询语句
在不同数据库中的使用的分页查询语句: 当前页:currentpage 页大小:pagesize 1. Oracle数据库 select * from (select A.*,rownum rn fro ...
- 【自由谈】城域网IPv6过渡技术——MAP技术(4)
本节接着回答MAP技术的第三个问题:“MAP-BR的Pool是如何实现?可靠性如何提升?” 在MAP域中通过将多个MAP-BR放在同一个Pool内实现负载分担和保护倒换的.同一个Pool中的每个MAP ...
- uva 1335 - Beijing Guards(二分)
题目链接:uva 1335 - Beijing Guards 题目大意:有n个人为成一个圈,其中第i个人想要r[i]种不同的礼物,相邻的两个人可以聊天,炫耀自己的礼物.如果两个相邻的人拥有同一种礼物, ...
- SQL ---指令实例语句
1 1 create database+数据库名字 创建数据库 2 2 create table+表的名字 创建表 3 表中的操作: 4 3 insert into 表名 (列名1,列名2··)val ...