lightoj 1265 Island of Survival 概率
这题我心里最承认的做法是dp[i][j]表示i个老虎,j个鹿的最大存活概率。然后推下转移方程,并不难推。下面这个博客就是这么做的。
https://blog.csdn.net/qq_36346262/article/details/77970325
但是实际上,这个做法边界判断有点多,感觉不优美,于是看了眼题解,发现鹿没用。
这个直观上我是不理解的,我觉得鹿可以帮人挡老虎,为什么没有用。但仔细想,人最后能不能活下来,取决于老虎们的自相残杀。但鹿不会影响到老虎的自相残杀。所以也能算解释一波。
这样子这个题就很简单了,老虎为奇数,肯定不行。老虎为偶数,我们就靠把人第一次没死,第二次没死...最后一次还没死的概率连乘起来。
(C(2,t) / C(2,t + 1)) * (C(2,t - 2) / C(2,t - 1)) ....* (C(2,2) / C(2,3))这个式子化简下就是1 / (t + 1)了。
然后发现了个语言基础的问题,用%lf输出0是会有问题的,需要写0.0。
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 int T,cas,n,m; 5 int main() 6 { 7 for (scanf("%d",&T);T != 0;T--) 8 { 9 scanf("%d%d",&n,&m); 10 if (n & 1) 11 { 12 printf("Case %d: %.6lf\n",++cas,0.0); 13 continue; 14 } 15 printf("Case %d: %.6lf\n",++cas,1.0 / (n + 1)); 16 } 17 return 0; 18 }
心之所动 且就随缘去吧