1133catalan數二維變種

2021-09-25 23:25:42 字數 1170 閱讀 2099

解題思路:

這個題目直接求合理的排序比較煩瑣,採用模擬的方法也顯然不行。可以先考慮可以實現的概率,再用實際的總次數去乘。

先把所有的n個拿50的人排好,接下來再把拿100的人插入佇列。求可行的概率。

n個拿50的人有n+1個空位,除了第乙個以外,其他的位置都可以,所以概率是n/n+1,在以上的基礎下,第2個的的概率是n-1/n(由於是求概率,所以可以把所有的拿50或100的人看成是一樣的,在這個前提下可以認為第乙個拿50的人和第乙個拿100的人一起消失了。為什麼可以這麼認為?由於在求概率,不去除的化會重複計算,具體讀者自己思考)。

同理直到最後乙個拿100的插入佇列,他成功的概率是n-m+1/n-m+2。

以上所有都發生,才使最後的隊伍滿足要求。所以最後成功的概率是n-m+1/n+1。再乘上全部的排列就是答案(m+n)!*(n-m+1)/(n+1)

最好高精度處理

這題也可以用組合數學的路程方法求解

公式為 c(m+n,m)-c(m+n,m-1)=(m+n)!(n-m+1)/(m!(n+1)!)

#include #include using namespace std; #define max_length 400 //最長的數字的長度 typedef struct long_int //定義了長數的結構 long_int; void init_long_int(long_int &a) //初始化全部為0 long_int int_to_long_int(int x) //返回x對應的長數,錯誤就列印錯誤 return a; } long_int multiply_int(long_int &a,int b) //乘法函式,返回a*b return c; } void long_int_printf(long_int &x) //長數列印函式 int main() { void init_long_int(long_int &a); //初始化函式a=0 long_int int_to_long_int(int x); //返回x對應的長數,錯誤就列印錯誤 long_int multiply_int(long_int &a,int b); //乘法函式,返回a*b(b是一般長度的) void long_int_printf(long_int &x); //長數列印函式 int a,b,i,t=0; long_int x; while (cin>>a>>b&&(a||b)) { t++; cout<<"test #"

二維取數dp

acwing 1027.方格取數 對於走一次,容易得到狀態轉移方程為 f i j max f i 1 j f i j 1 w i j 而對於走兩次時,設定狀態為 f i 1 j 1 i 2 j 2 表示第一條路徑從 1,1 走到 i 1,j 1 第二條路徑從 1,1 走到 i 2,j 2 取的數的最...

二維數 三維陣列

二維陣列 2017 11 10 對比 1 概念 一維陣列 存貯一組相同型別資料 二維陣列 存貯著多個一維陣列 類推 三維陣列 存貯著多個二維陣列 2 宣告 一維陣列 陣列型別 陣列名 初始值 int arr01 int arr00 new int 5 二維陣列 陣列型別 陣列名 初值 陣列型別為一維...

js 標準二維陣列變一維陣列的方法

利用es5的arr.reduce callback initialvalue 實現 var arr1 0,1 2,3 4,5 var arr2 arr1.reduce function a,b arr2 0,1,2,3,4,5 利用es6 var arr1 0,1 2,3 4,5 function ...