數學專題訓練3

2021-06-20 17:22:23 字數 2767 閱讀 6833

這次是概率專練

選的題都比較基礎。。因為我對概率的感覺很不到位啊啊啊啊

題目一:wikioi計算概率

這個就是古典概型嘛。。。先列舉選的第一根。。。然後再求出第選二根後和小於等於l的方案個數。然後答案很自然就是 這些方案個數的和/n*(n-1)了。。

考慮到n稍大。。求方案數不能直接暴力。。。可以選擇二分來求(要注意選的第二根不能與第一根一樣。。所以二分後還要判斷下這些可選的木棍是否包含了第一根,包含了的話減去)

#include#include#include#include#include#includeusing namespace std;

int n,ll;

int len[100000+10];

double ans=0;

int main()

if(l>=i)

if(l==1&&len[1]+len[i]>ll)l--;

ans=ans+l*1.0/(n-1);

} printf("%.2f\n",ans/n);

return 0;

}

第二題:rqnoj矩陣粉刷

rq的某次月賽題。。。當時我是第一次參加網賽。。結果一道都不會 t_t

其實這題的題意我覺得不是太清楚。。。說的隨機選兩個點。。。其實選的這兩個點可以是乙個。。然後對應的矩形就是乙個小方格了

期望方塊數自然就是 每個方塊的被刷到的概率*權值1 的和。

但是要粉刷k次。。。不好直接求哪個小方格被刷的概率。。。於是可以求某次不被刷的概率 p,然後1-p^k就是被刷的概率啦

然後某次不被刷的概率又要用1-某次被刷的概率來求。。

考慮到這樣乙個問題:對於每個方塊。。。包含了它的矩形一定有兩個相對的頂點在它的坐上方和右下方。。。(包括它本身所在座標)

然後這樣的矩形數基本上就是 左上角點橫座標可選方案數*縱座標可選方案數*右下角點橫座標可選方案數*縱座標可選方案數。

對於不為乙個或一行一列的矩形。。。有四種選點的方式會選到它,對於是一行或一列的矩形只有兩種,對於只有一格的矩形(也就是正好是這一格本身)只統計了一次。。。

於是我們就列舉方塊(i,j)

其一次被粉刷的方案數為 4*i*j*(w-i+1)*(h-j+1)-2*(i*(w-i+1)+j*(h-j+1))+1 (先全當成普通的矩形,然後減去為一行或一列時多計算的次數,再加上多扣了的當乙個格仔時的次數),概率就是  上面那個式子/w*w*h*h

這題基本上就這樣了。。。

#include#include#include#include#include#includeusing namespace std;

long long k,w,h;

double ans=0;

double qpow(double d,int c)

int main()

} printf("%.0f\n",ans);

return 0;

}

題目三:rqnoj bomb

我覺得稍微有點高階的題。。。糾結了很久(當然對大神們來說還是水到爆啦)

這道題是一道與期望有關的dp

狀態這麼設計:dp[i]表示剩i個精靈時的期望操作次數(我開始設計成減少i個的期望。。。結果糾結半天)

然後就可以得出這樣乙個方程:

dp[i]=(dp[i]*p[0]+dp[i-1]*p[1]+dp[i-2]*p[2]+....+dp[i-5]*p[5])+1;

直接用這個方程來遞推的話。。。當然不行。。。因為左右都有dp[i];

所以移個項整理一下...變成dp[i]=p[1]/(1-p[0])*dp[i-1]+...+p[5]/(1-p[0])*dp[i-5]+1/(1-p[0]);

邊界是這樣的:對於i考慮到資料範圍有點大。。。這個遞推又是線性的。於是就可以想到用矩陣乘法來優化。。。

然後基本就沒什麼難點了

#include#include#include#include#include#includeusing namespace std;

int n,m;

double p[10];

double end=0;

struct mat

mat operator *(const mat &b)

}return c;

}}start,single,ele;

void readdata()

double dp[5+10];

void pre()

start.num[1][1]=dp[4];

start.num[2][1]=dp[3];

start.num[3][1]=dp[2];

start.num[4][1]=dp[1];

start.num[5][1]=dp[0];

start.num[6][1]=1.0/(1-p[0]);

single.x=single.y=6;

for(int i=1;i<=6;i++)

for(int i=1;i<=5;i++)ele.num[1][i]=p[i]/(1-p[0]);

ele.x=ele.y=6;

ele.num[1][6]=1;ele.num[2][1]=ele.num[3][2]=ele.num[4][3]=ele.num[5][4]=1;

ele.num[6][6]=1;

}mat qpow(const mat &d,int c)

int main()

return 0;

}

數學專題訓練4

這次是矩陣與行列式 題目一 bzoj1013 我看到這題時反正沒什麼感覺。其實對於球來說。其上每乙個點到球心的距離都是相等的。於是就可以根據這個來列方程 設球心為 x1,x2,對於點 a1,a2,b1,b2,有 ai xi 2 bi xi 2 看起來很麻煩。因為方程有二次項 但其實這個式子是可以開啟...

數學專題測試3 題解

大概的意思是說,由低到高考慮不同的二進位制位。形成乙個最小生成樹,那麼最高二進位制位不同的情況一定只出現一次。所以除掉最高位之後的情況形成兩個集合,遞迴下去 dp 就好了。乙個技巧是,將每個方案的最小值的總和,即 sum limits min i 轉化為 sum limits f min i 然而還...

專題訓練(2)

本週的學習內容 樹狀陣列 用於對區間操作非常方便。1001 求乙個整數,二進位制表示形式中最低位的1代表的整數。就是樹狀陣列中,求lowbit的操作。題解 include using namespace std intmain return0 1002 樹狀陣列的應用。點操作,區間查詢。剛開始樹狀陣...