题目链接: 

pid=4870">http://acm.hdu.edu.cn/showproblem.php?pid=4870

题目大意:

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

解题思路:

用E(x。y)表示到(1000, 950)这个状态须要多少场。由于(1000,X) X != 950 这样的情况是不可能发生的。最后E(0,0)就是答案。

E(x1, y1) = E(x2, y2) * p + E(x3, y3) * (1 - p) + 1 是状态,所以能够列出210个方程。用高斯消元就可以。

代码:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<deque>
#include<list>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<numeric>
#include<iomanip>
#include<bitset>
#include<sstream>
#include<fstream>
#define debug puts("-----")
#define pi (acos(-1.0))
#define eps (1e-8)
#define inf (1<<30)
#define seek 31
#define LL long long
#define ULL unsigned long long
#define maxn 222
#define For(i, n) for (int i = 0; i < n; i++)
using namespace std;
double a[maxn][maxn] = {0}, ans[maxn] = {0};
bool l[maxn];
int n;
inline int solve(double a[][maxn], bool l[], double ans[], const int& n) {
int res = 0, r = 0;
for (int i = 0; i < n; i++) l[i] = false;
for (int i = 0; i < n; i++) {
for (int j = r; j < n; j++)
if (fabs(a[j][i]) > eps) {
for (int k = i; k <= n; k++) swap(a[j][k], a[r][k]);
break;
}
if (fabs(a[r][i]) < eps) {
res++;
continue;
}
for (int j = 0; j < n; j++)
if (j != r && fabs(a[j][i]) > eps) {
double tmp = a[j][i] / a[r][i];
for (int k = i; k <= n; k++) a[j][k] -= tmp * a[r][k];
}
l[i] = true, r++;
}
for (int i = 0; i < n; i++)
if (l[i])
for (int j = 0; j < n; j++)
if (fabs(a[j][i]) > 0)
ans[i] = a[j][n] / a[j][i];
return res;
} int cnt = 0, mark[22][22] = {0};
double p;
void build() {
for (int i = 0; i < 20; i++) {
for (int j = 0; j <= i; j++) {
int x = mark[i][j];
a[x][x] = 1, a[x][210] = 1;
a[x][mark[i][max(0, j - 2)]] -= (1 - p);
a[x][mark[max(i, j + 1)][min(i, j + 1)]] -= p;
}
}
}
int main () {
memset(mark, -1, sizeof(mark));
for (int i = 0; i < 20; i++)
for (int j = 0; j <= i; j++)
mark[i][j] = cnt++;
while(~scanf("%lf", &p)) {
memset(a, 0, sizeof(a));
build();
solve(a, l, ans, 210);
printf("%.6lf\n", ans[0]);
}
return 0;
}

2014 Multi-University Training Contest 1 - J Rating的更多相关文章

  1. 2016 Multi-University Training Contest 1 J.Subway

    Subway Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Su ...

  2. 2016 Al-Baath University Training Camp Contest-1 J

    Description X is fighting beasts in the forest, in order to have a better chance to survive he's gon ...

  3. HDU 4870 Rating (2014 Multi-University Training Contest 1)

    Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  4. HDU4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)

    Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  5. 2014 Multi-University Training Contest 9#6

    2014 Multi-University Training Contest 9#6 Fast Matrix CalculationTime Limit: 2000/1000 MS (Java/Oth ...

  6. 2014 Multi-University Training Contest 1/HDU4861_Couple doubi(数论/法)

    解题报告 两人轮流取球,大的人赢,,, 贴官方题解,,,反正我看不懂.,,先留着理解 关于费马小定理 关于原根 找规律找到的,,,sad,,, 非常easy找到循环节为p-1,每个循环节中有一个非零的 ...

  7. 2014 Multi-University Training Contest 1/HDU4864_Task(贪心)

    解题报告 题意,有n个机器.m个任务. 每一个机器至多能完毕一个任务.对于每一个机器,有一个最大执行时间Ti和等级Li,对于每一个任务,也有一个执行时间Tj和等级Lj.仅仅有当Ti>=Tj且Li ...

  8. HDU 2018 Multi-University Training Contest 3 Problem A. Ascending Rating 【单调队列优化】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6319 Problem A. Ascending Rating Time Limit: 10000/500 ...

  9. hdu 4937 2014 Multi-University Training Contest 7 1003

    Lucky Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) T ...

随机推荐

  1. Android开发之大位图二次採样压缩处理(源码分享)

    图片有各种形状和大小.在很多情况下这些图片是远远大于我们的用户界面(UI)且占领着极大的内存空间,假设我们不正确位图进行压缩处理,我们的程序会发生内存泄露的错误. MainActivity的代码 pa ...

  2. 体验魅力Cognos BI 10 系列,第1 部分: 第一次安装

    体验魅力Cognos BI 10 系列,第1 部分: 第一次安装吴敏达, 信息管理软件高级技术顾问, IBM简介: 本系列教程旨在帮助您通过实际动手掌握Cognos BI 10.1 的主要功能.在这一 ...

  3. var, object, dynamic的区别以及使用(转载)

    var, object, dynamic的区别以及使用 阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 拿这三者比较的原因 ...

  4. Git flow 的流程

    Git flow 的流程与参考   Git flow 出自 A successful Git branching model,这里使用了一个前端项目配合本文稿实施了 git flow 并记录流程作出示 ...

  5. Kendo UI开发教程(22): Kendo MVVM 数据绑定(十一) Value

    Value绑定可以把ViewModel的某个属性绑定到DOM元素或某个UI组件的Value属性.当用户修改DOM元素或UI组件的值时,绑定的ViewModel的值也随之发生改名.同样,如果ViewMo ...

  6. JavaScript编程:浏览器对象模型BOM

    4.浏览器对象模型BOM: document.body.offsetwidth可以获取浏览器宽度. Window对象:          窗口操作:            1.moveBy(dx,dy ...

  7. Android Sip学习(三)Android Voip实现

    Android Sip学习(三)Android Voip实现   Android Sip学习(准备知识)SIP 协议完整的呼叫流程 Android Sip学习(一)Android 2.3 APIs S ...

  8. boost::thread之while(true)型线程终结方法

    我们的程序中经常会用到线程来执行某些异步操作,而有些时候我们的线程执行的函数是这个样子的: void ThreadBody() { while( true ) { std::cout << ...

  9. [置顶] android之Notification版本兼容性问题

    首先先来创建一个notification提示 //概要 String tickerText = context.getResources().getText(R.string.app_name).to ...

  10. 什么是VSync

    VSync是垂直同期(Vertical Synchronization)的简称.主要的思路是将你的FPS和显示器的刷新率同期起来.其目的是避免一种称之为"撕裂"的现象.再以下我将具 ...