您的位置:首页 > 其它

sdut 2878 Circle 高斯消元

2016-05-23 20:41 417 查看


题意:

在一个0~n的环上每次可以向左走或向右走
求走到x的步数的期望
分析:
因为是环形的不好递推
考虑到 dp【i】=dp【(i+1)%n】/2+dp【(i-1)%n】/2+1
可以转化为 dp【i】-dp【(i+1)%n】/2-dp【(i-1)%n】/2=1
所以可以列n个方程利用高斯消元来解貌似网上有别的做法表示看不懂orz
ACcode:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#define maxn 1005
using namespace std;
double a[maxn][maxn],x[maxn];
double Gauss(int n){
int row,col,max_r;
int equ=n,var=n;
for(row=0,col=0;row<equ&&col<var;row++,col++){
max_r=row;
for(int i=row+1;i<var;i++)
if(fabs(a[i][col])>fabs(a[max_r][col]))
max_r=i;
if(max_r!=row)
for(int j=row;j<n+1;j++)
swap(a[max_r][j],a[row][j]);
for(int i=row+1;i<var;i++)
if(fabs(a[i][col])>=1e-8){
double tmp=a[i][col]/a[row][col];
for(int j=col;j<n+1;j++)
a[i][j]-=a[row][j]*tmp;
}
}
for(int i=equ-1;i>=0;i--){
double tmp=a[i]
;
for(int j=i+1;j<n;j++)
if(fabs(a[i][j])>1e-8)
tmp-=a[i][j]*x[j];
x[i]=tmp/a[i][i];
}
return x[0];
}
int main(){
int loop,my_x,n;
scanf("%d",&loop);
while(loop--){
scanf("%d%d",&n,&my_x);
memset(a,0,sizeof(a));
for(int i=0;i<n;++i)
if(i!=my_x){
a[i][i]=a[i]
=1;
a[i][(i-1+n)%n]=a[i][(i+1)%n]=-0.5;
}
a[my_x][my_x]=1;a[my_x]
=0;
printf("%.4lf\n",Gauss(n));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: