題意:給定乙個概率p,做一道題有p概率成功,(1-p)概率失敗。成功分數+50,最高1000;失敗分數-100,最低0分。現有兩個賬號,每次選擇分數低的賬號去做題,問其中乙個賬號達到1000分的期望次數。
題解:(1)高斯消元法
得分必須是f(0,0)->f(0,50)->f(50,50)->...->f(950,950)->f(950,1000)。所以所求期望次數就是到乙個賬號到1000的期望次數加上另乙個賬號達到950分的期望次數。記f(i)表示分數i*50到1000分需要的期望次數。那麼答案ans=f(0)*2-f(19)。也就是說兩次都到1000分,然後減去一次950到1000分的期望次數。
我們可以列方程,對於i>=2的數來說,我們記xi=f(i),那麼可以得到方程組xi=p*(x(i+1)+1)+(1-p)*(x(i-2)+1)。其中(0<=i<20,i為0和1時需要特別處理,x20=0)。這樣我們就可以直接套高斯消元法的模板了。
(2)遞推式
思路跟上面差不多,我們將f(0)->f(50)記為g[0],f(50)->f(100)記為g[1]。。。,以此類推。那麼答案ans=∑g[i]*2+g[19](0<=i<=18),先求出g[0]和g[1](列出式子,化解等比數列)。然後發現g[i]和g[i-1]+g[i-2]有關,具體見**和**注釋說明。
**:高斯消元發求解:
#include #include #include #include #include #include #include #include using namespace std;
//高斯消元
const int eps=1e-8;
const int maxn=22;
struct matrixa;
void gauss_jordan(int n)
}int n,d[maxn];
int inf[maxn];
int main()
gauss_jordan(20);
memset(inf,0,sizeof(inf));
for(i=n-1;i>=0;i--)
printf("%.6f\n",a.f[0][20]/a.f[0][0]*2-a.f[19][20]/a.f[19][19]);
}return 0;
}
遞推式求解:
//遞迴公式
#include #include #include #include #include #include #include #include using namespace std;
double f[100],s[100];
int main()
printf("%.6f\n",s[19]-f[19]);
}return 0;}/*
我們可以知道得分過程為f[0][0]->f[0][50]->f[50][50]->...->f[950][1000]
我們發現g[0][0]->g[0][50]和g[0][50]->g[50][50]的期望路長是一樣的,
所以我們只用求g[0]->g[50]->g[100]->...->g[1000],記為f[i]
ans=∑f[i]*2+f[19](0<=i<=18)
我們先求出f[0]和f[1],之後我們發現x到x+50,有兩種情況一種是x+50,
另一種是x-100,x-100到x,期望路長已經求過為f[i-1]+f[i-2],最終得到乙個等比數列,
解得f[i]=(f[i-1]+f[i-2]+1-(f[i-1]+f[i-2])*p)/p;
*/
HDU4870 Rating 高斯消元
有個人有兩個0分賬號,他可以打比賽,他每次用分低的那個賬號打比賽,有p的概率名列前茅,加50分 上限1000分 否則掉100分 下限0分 問有乙個賬號到1000分的期望。先壓縮一下狀態,把50 5050 看作1 11,把100 10010 0看作2 22,把1000 1000 1000 看作20 2...
HDU 4870 Rating 高斯消元法
題意 用兩個賬號去參加一種比賽,初始狀態下兩個賬號都是零分,每次比賽都用分數低的賬號去比賽。有p的概率取勝,相應賬號分數 50分,否則相應賬號分數下降100分,問當有乙個賬號分數達到1000分時參加比賽次數的數學期望是多少。思路 比賽期間以為是一道推公式的題,推了半天沒什麼收穫。賽後想了想。看了解題...
hdu4870 高斯消元
題意 乙個人打比賽 rating 有p的概率 為加50分 有1 p的概率為 x 100分 最大值為 1000 最小值為0 有兩個號 每次拿較小的號來提交 計算最後到達 1000分得期望場數是多少,對每個狀態建立乙個方程然後用高斯消元解決 include include include include...