題意:有很多張牌,當翻開一張數值是x,那就再翻這張牌後面的第x張,直到翻到一張他後面的第x張不存在,給出一個人翻牌的起始位置,翻的n張牌,問第二個人從前十張任意一張開始翻,結束位置和第一個人相同的概率。J,Q,K的值都是10,A是11。
比較水的概率dp,只是一開始沒讀懂題……從前十個位置開始,那麼就是前十個位置的概率初始值爲0.1,其餘爲0,如果第一個人翻開了的位置,那麼數字就是確定的了,一定會轉移到下一個固定位置,就是第一個翻開的下一個位置,對於其他位置會有4/13的可能前進10步其餘可能各1/13。最後輸出第一個dp[m],m是第一個翻開的最後一張牌的位置。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
double dp[2000];
int id[2000];
char s[10];
int main() {
int n, m, mx, a, i, j;
while(~scanf("%d%d", &n, &m)) {
memset(dp, 0, sizeof(dp));
memset(id, 0, sizeof(id));
for(i = 0; i < n; i++) {
scanf("%s", s);
if(s[1] != 0 || s[0] > 'A')
a = 10;
else if(s[0] == 'A')
a = 11;
else a = s[0] - '0';
id[m] = a;
m += a;
}
m -= a;
for(i = 1; i < 11; i++)
dp[i] = 0.1;
for(i = 1; i < m; i++) {
if(id[i] != 0) {
dp[i + id[i]] += dp[i];
continue;
}
for(j = 2; j < 12; j++) {
if(j == 10)
dp[i + j] += dp[i] * 4.0 / 13;
else dp[i + j] += dp[i] * 1.0 / 13;
}
}
printf("%.15lf\n", dp[m]);
}
return 0;
}