日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【DP】奖励卡(jzoj 3937)

發(fā)布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【DP】奖励卡(jzoj 3937) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

獎勵卡

jzoj 3937

題目大意

現(xiàn)在有一場比賽,想觀看的人要提交申請,現(xiàn)在有x個人提交后得到兩個號,y個人提交后得到一個號,有n輪抽號,每一輪抽一個號(概率相等),這個號的所有者不參與下一輪抽號(即他的所有號消掉),現(xiàn)在問你:你拿一個號和拿兩個號抽中的概率(你不算在前面的x,y中,寫得很亂,見諒)

輸入樣例

輸入樣例#1
1 1 2
輸入樣例#2
10 10 10

輸出樣例

輸出樣例#1
0.3333333333333333 0.2
輸出樣例#2
0.5870875690480144 0.3640355515319861

輸出要求

答案誤差不得超過10?910^{-9}10?9

數(shù)據(jù)范圍

對于 10%的數(shù)據(jù),n?2。n\leqslant 2。n?2
對于 20%的數(shù)據(jù),n?3。n\leqslant 3。n?3
對于 30%的數(shù)據(jù),n?4,a,b?4。n\leqslant 4,a,b\leqslant 4。n?4a,b?4
對于 60%的數(shù)據(jù),n?3000,a,b?2000。n\leqslant 3000,a,b\leqslant 2000。n?3000a,b?2000
對于 100%的數(shù)據(jù),1?n?3000,0?a,b?109。1\leqslant n\leqslant 3000,0\leqslant a,b\leqslant 10^9。1?n?30000?a,b?109

解題思路

因為n有3000,a、b有10910^9109,所以我們不可能枚舉每一輪抽到誰
那我們可以想到DPDPDP
我們設(shè)f[i][j]f[i][j]f[i][j]為第iii輪為止有jjj個有兩個號的人中了且你還沒中的概率
f[i][j]f[i][j]f[i][j]轉(zhuǎn)移的狀態(tài)有三個:f[i][j]f[i][j]f[i][j],f[i][j+1]f[i][j+1]f[i][j+1]和你中了
然后分開轉(zhuǎn)移即可

代碼

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; int n, a, b; double x, y, ans, f[3050][3050]; int main() {scanf("%d%d%d", &n, &a, &b);a++; //先處理拿兩個號的情況f[0][0] = 1;//100%for (int i = 0; i < min(n, a + b); ++i)//要保證不會回合比人數(shù)多for (int j = 0; j <= min(a, i); ++j)//要保證中了的人數(shù)要小于回合數(shù){x = (double)(a - j);//a中中了j個,剩下的(a-j)個y = (double)(b - (i - j));//i回合,a中中了j個,b中中了(i-j)個,剩下(b-(i-j))個f[i + 1][j + 1] += f[i][j] * ((x - 1) * 2) / (x * 2 + y);//(x*2+y)個號,有((x-1)*2)個號不是你的且是a類剩下的f[i + 1][j] += f[i][j] * y / (x * 2 + y);//y個人是b類剩下的ans += f[i][j] * 2 / (x * 2 + y);//你有兩張票}printf("%.16g\n", ans);a--;//減去原先的b++;//現(xiàn)在枚舉你有一張票ans = 0;memset(f, 0, sizeof(f));f[0][0] = 1;for (int i = 0; i < min(n, a + b); ++i)for (int j = 0; j <= min(a, i); ++j){x = (double)(a - j);y = (double)(b - (i - j));f[i + 1][j + 1] += f[i][j] * (x * 2) / (x * 2 + y);f[i + 1][j] += f[i][j] * (y - 1) / (x * 2 + y);//(y-1)個號不是你的切實b類剩下的ans += f[i][j] / (x * 2 + y);//你只有一個號}printf("%.16g", ans);return 0; }

總結(jié)

以上是生活随笔為你收集整理的【DP】奖励卡(jzoj 3937)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。