這次是概率專練
選的題都比較基礎。。因為我對概率的感覺很不到位啊啊啊啊
題目一: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 樹狀陣列的應用。點操作,區間查詢。剛開始樹狀陣...