HDU 4870 Rating(高斯消元)

HDU 4870 Rating

题目链接

题意:一个人注册两个账号,初始rating都是0,他每次拿低分的那个号去打比赛,赢了加50分,输了扣100分,胜率为p,他会打到直到一个号有1000分为止,问比赛场次的期望

思路:f(i, j)表示i >= j,第一个号i分,第二个号j分时候,达到目标的期望,那么可以列出转移为f(i, j) = p f(i‘, j‘) + (1 - p)
f(i‘‘ + j‘‘) + 1

f(i‘, j‘)对应的是赢了加分的状态,f(i‘‘, j‘‘)对应输的扣分的状态,可以把50分当作一个单位,一共有20 * 21 / 2 = 210个状态,也就是对应了210个方程组,利用高斯消元去求解方程组,解出f(0, 0)就是答案

代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

const double eps = 1e-9;
const int N = 305;

double p, a[N][N];
int mark[25][25];

double solve() {
    for (int i = 0; i < 210; i ++) {
	int k = i;
	for (; k < 210; k++)
	    if (fabs(a[k][i]) > eps) break;
	for (int j = 0; j <= 210; j++)
	    swap(a[i][j], a[k][j]);
	for (int j = 0; j < 210; j++) {
	    if (i == j) continue;
	    if (fabs(a[j][i]) > eps) {
		double x = a[j][i] / a[i][i];
		for (int k = i; k <= 210; k++) {
		    a[j][k] -= a[i][k] * x;
		}
	    }
	}
    }
    return a[0][210] / a[0][0];
}

void build() {
    memset(a, 0, sizeof(a));
    for (int i = 0; i < 20; i++) {
	for (int j = 0; j < i; j++) {
	    int u = mark[i][j];
	    a[u][u] = 1;
	    a[u][210] = 1;
	    int v = mark[i][max(0, j - 2)];
	    a[u][v] -= (1 - p);
	    v = mark[i][j + 1];
	    a[u][v] -= p;
	}
	int u = mark[i][i];
	a[u][u] = 1;
	a[u][210] = 1;
	int v = mark[i][max(0, i - 2)];
	a[u][v] -= (1 - p);
	v = mark[i + 1][i];
	a[u][v] -= p;
    }
}

int main() {
    int cnt = 0;
    memset(mark, -1, sizeof(mark));
    for (int i = 0; i < 20; i++) {
	for (int j = 0; j <= i; j++) {
	    mark[i][j] = cnt;
	    cnt++;
	}
    }
    while (~scanf("%lf", &p)) {
	build();
	printf("%.6lf\n", solve());
    }
    return 0;
}

HDU 4870 Rating(高斯消元),布布扣,bubuko.com

时间: 2024-10-25 16:34:34

HDU 4870 Rating(高斯消元)的相关文章

hdu 4870 Rating(高斯消元求期望)

http://acm.hdu.edu.cn/showproblem.php?pid=4870 题意:有两个号,初始分数都是0,每次选一个分数较小的打比赛,如果分数一样任选一个,有p的概率涨50分,最高为1000分,有1-p的概率跌100分,最低为0分.问有一个号涨到1000需要打比赛的次数的期望. 令(x, y)表示高分为x,低分为y的状态(x >= y),E(x, y)表示从(x, y)到达(1000, ?)的比赛场数期望.容易得到E(x, y) = P * E(x1, y1) + (1 - 

HDU 3949 XOR 高斯消元

题目大意:给定一个数组,求这些数组通过异或能得到的数中的第k小是多少 首先高斯消元求出线性基,然后将k按照二进制拆分即可 注意当高斯消元结束后若末尾有0则第1小是0 特判一下然后k-- 然后HDU输出long long是用%I64d 无论C艹还是G艹都是 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define M 10100 using namespa

hdu 5755(高斯消元——模线性方程组模板)

知道了是高斯消元后,其实只要稍加处理,就可以解决带模的情况. 1 是在进行矩阵行变化的时候,取模. 2 最后的除法用逆元.(因为a[i][i]必定非0 且小于模数) 然后对于无穷多解的情况,只需要将那些列全为0的未知数定义一个固定值.(这里设的是0)其余操作不变. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath&g

2014多校第一场J题 || HDU 4870 Rating(DP || 高斯消元)

题目链接 题意 :小女孩注册了两个比赛的帐号,初始分值都为0,每做一次比赛如果排名在前两百名,rating涨50,否则降100,告诉你她每次比赛在前两百名的概率p,如果她每次做题都用两个账号中分数低的那个去做,问她最终有一个账号达到1000分需要做的比赛的次数的期望值. 思路 :可以直接用公式推出来用DP做,也可以列出210个方程组用高斯消元去做. (1)DP1:离散化.因为50,100,1000都是50的倍数,所以就看作1,2,20.这样做起来比较方便. 定义dp[i]为从 i 分数到达i+1

HDU 4870 Rating(高斯消元 )

HDU 4870   Rating 这是前几天多校的题目,高了好久突然听旁边的大神推出来说是可以用高斯消元,一直喊着赶快敲模板,对于从来没有接触过高斯消元的我来说根本就是一头雾水,无赖之下这几天做DP,正好又做到了这个题,没办法得从头开始看,后来在网上找了别人的高斯消元的模板后发现其实也还是很好理解,就是先构造一个增广矩阵,然后化行阶梯形,最后迭代求解 首先有一个介绍高斯消元感觉过于详细的博客http://blog.csdn.net/tsaid/article/details/7329301 首

hdu 4870 Rating(概率DP&amp;高数消元)

Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 714    Accepted Submission(s): 452 Special Judge Problem Description A little girl loves programming competition very much. Recently, she

ACM学习历程—HDU 3915 Game(Nim博弈 &amp;&amp; xor高斯消元)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3915 题目大意是给了n个堆,然后去掉一些堆,使得先手变成必败局势. 首先这是个Nim博弈,必败局势是所有xor和为0. 那么自然变成了n个数里面取出一些数,使得xor和为0,求取法数. 首先由xor高斯消元得到一组向量基,但是这些向量基是无法表示0的. 所以要表示0,必须有若干0来表示,所以n-row就是消元结束后0的个数,那么2^(n-row)就是能组成0的种数. 对n==row特判一下. 代码:

hdu 2262 高斯消元求期望

Where is the canteen Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1070    Accepted Submission(s): 298 Problem Description After a long drastic struggle with himself, LL decide to go for some

ACM学习历程—HDU 3949 XOR(xor高斯消元)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 题目大意是给n个数,然后随便取几个数求xor和,求第k小的.(重复不计算) 首先想把所有xor的值都求出来,对于这个规模的n是不可行的. 然后之前有过类似的题,求最大的,有一种方法用到了线性基. 那么线性基能不能表示第k大的呢? 显然,因为线性基可以不重复的表示所有结果.它和原数组是等价的. 对于一个满秩矩阵 100000 010000 001000 000100 000010 000001