标签:ace logs 数字 end register 判断 bsp int 例子
对于100%的数据,有1<=N<=50 1<=M<=50 1<=每张卡片上的数字<=50
正解:期望$dp$。
设$f[i][j]$表示总共有$i$个人,第$j$个人获胜的概率。
然后$f[i][j]=\sum_{k=1}^{m}f[i-1][p]/m$,其中$p$是被踢掉一个人以后$j$的位置,同时还要判断$j$会不会被踢掉。
1 #include <bits/stdc++.h> 2 #define il inline 3 #define RG register 4 #define ll long long 5 6 using namespace std; 7 8 int vis[55][55],a[55],n,m; 9 double f[55][55]; 10 11 il int gi(){ 12 RG int x=0,q=1; RG char ch=getchar(); 13 while ((ch<‘0‘ || ch>‘9‘) && ch!=‘-‘) ch=getchar(); 14 if (ch==‘-‘) q=-1,ch=getchar(); 15 while (ch>=‘0‘ && ch<=‘9‘) x=x*10+ch-48,ch=getchar(); 16 return q*x; 17 } 18 19 il double dfs(RG int x,RG int y){ 20 if (x==1) return 1; 21 if (vis[x][y]) return f[x][y]; 22 vis[x][y]=1; RG double res=0; 23 for (RG int i=1,kill;i<=m;++i){ 24 kill=(a[i]-1)%x+1; if (kill==y) continue; 25 res+=dfs(x-1,(y-kill+x)%x); 26 } 27 return f[x][y]=1.0*res/m; 28 } 29 30 int main(){ 31 #ifndef ONLINE_JUDGE 32 freopen("game.in","r",stdin); 33 freopen("game.out","w",stdout); 34 #endif 35 n=gi(),m=gi(); 36 for (RG int i=1;i<=m;++i) a[i]=gi(); printf("%0.2lf%%",dfs(n,1)*100); 37 for (RG int i=2;i<=n;++i) printf(" %0.2lf%%",dfs(n,i)*100); 38 return 0; 39 }
标签:ace logs 数字 end register 判断 bsp int 例子
原文地址:http://www.cnblogs.com/wfj2048/p/7795716.html