SDUT 2878 Circle (高斯消元)
来源:互联网 发布:java rmi 漏洞 修复 编辑:程序博客网 时间:2024/05/19 13:08
题意
初始时站在0点,每次有0.5的几率左移一格或者右移一格,求移动到x格的期望。
思路
显然我们能写出来
这样的式子我们能写出n个,然后这个式子转化一下变成
代码
#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;#define LL long long#define Lowbit(x) ((x)&(-x))#define lson l, mid, rt << 1#define rson mid + 1, r, rt << 1|1#define MP(a, b) make_pair(a, b)const int INF = 0x3f3f3f3f;const int MOD = 1000000007;const int maxn = 1e5 + 7;const double eps = 1e-8;const double PI = acos(-1.0);int n, xx, equ, var;double a[1010][1010];bool free_x[1010];double x[1010];/*返回-1无解返回0唯一解大于0多解,且返回自由变元个数可以用free_x判断不确定的解*/int gauss(){ int i, j, k, col, max_r; for (k = 0, col = 0; k < equ && col < var; k++, col++) { max_r = k; for (int i = k + 1; i < equ; i++) if (fabs(a[i][col]) > fabs(a[max_r][col])) max_r = i; if (fabs(a[max_r][col]) < eps) return 0; if (k != max_r) { for (j = k; j <= var; j++) swap(a[k][j], a[max_r][j]); } if (fabs(a[k][col]) == 0) { k--; continue; } for (i = k + 1; i < equ; i++) { if (fabs(a[i][col]) == 0) continue; double temp = a[i][col] / a[k][col]; for (j = col; j <= var; j++) a[i][j] -= a[k][j] * temp; } } //无解 for (i = k; i < equ; i++) { if (fabs(a[i][col]) > eps) return -1; } //无穷解 if (k < var) { for (i = k - 1; i >= 0; i--) { int free_num = 0; //变元个数 int free_index; //变元 for (j = 0; j < n; j++) { if (fabs(a[i][j]) && free_x[j]) free_num++, free_index = j; } if (free_num > 1) //有两个以上的变元无法确定 continue; double temp = a[i][n]; for (j = 0; j < n; j++) { if (fabs(a[i][j]) && j != free_index) temp -= a[i][j] * x[j]; } x[free_index] = temp / a[i][free_index]; free_x[free_index] = 0; } return var - k; } for (i = equ - 1; i >= 0; i--) { double temp = a[i][n]; for (j = i + 1; j < var; j++) if (fabs(a[i][j]) != 0) temp -= a[i][j] * x[j]; x[i] = temp / a[i][i]; } return 0;}int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int t; scanf("%d", &t); while (t--) { scanf("%d%d", &n, &xx); memset(a, 0, sizeof(a)); memset(x, 0, sizeof(x)); for (int i = 0; i < n; i++) { if (i == xx) { a[i][i] = 1; a[i][n] = 0; } else { a[i][i] = 1; a[i][n] = 1; a[i][(i+n-1)%n] = -0.5; a[i][(i+n+1)%n] = -0.5; } } equ = n, var = n; gauss(); printf("%.4f\n", x[0]); } return 0;}
0 0
- SDUT 2878 Circle (高斯消元)
- sdut 2878 Circle 高斯消元
- [ACM] sdut 2878 Circle (高斯消元)
- SDUT-2878-Circle(概率DP/高斯消元)
- SDUT 2878 Circle(概率dp)
- sdut 2878 Circle (求期望+高斯消元求解)
- sdut 2878 Circle 第五届ACM省赛(高斯消元)
- sdut 3262 Circle of Friends tarjan
- sdut 3262 Circle of Friends (SCC缩点)
- SDUT-3262-Circle of Friends(强连通分量)
- circle ``
- Circle
- circle
- SDUT 3262 Circle of Friends【强连通Tarjan+缩点染色+最短路SPFA】
- sdut 3262 Circle of Friends (SCC缩点) 有向图 强连通分量模板
- 第五届山东省ACM Circle(高斯消元)
- circle pendants
- Circle ZOj3321
- React Native 的 Navigator 组件使用方式
- 乐观锁和悲观锁的区别
- java中命令模式
- erjinzhi
- 数据源配置之一
- SDUT 2878 Circle (高斯消元)
- 189. Rotate Array数组右移
- ubuntu 环境下搭建 scikit-learn 环境
- Leet Code OJ 28. Implement strStr() [Difficulty: Easy]
- sqlserver中All、Any和Some用法与区别
- activiti 23个表创建语句(一)续
- 第一次博客
- 将十进制数转化为二进制数
- CSS中overflow的用法