題目大意:有n個景點,m條無向邊,經過每條邊的時間需要的時間是li,在第i個景點遊覽花費的時間是ti,遊覽完第i個景點可以獲得的滿意度是hi。你的總時間為k,起初你等概率的選擇遊覽乙個景點,然後每次等概率的前往乙個相鄰的景點遊覽,當你剩餘時間不夠遊覽乙個相鄰的景點時就結束遊覽。問所獲得的滿意度的期望值。(本題強行詢問兩次~)
n<=100,總時間<=500
題解:顯然的期望dp啊,不過本題的細節比較多,我這裡只說一些細節吧~
用f[i][j]表示遊覽完景點i,還剩時間j,所獲得的期望滿意度。顯然f[i][j]可以由相鄰的景點轉移而來,不過可沒那麼簡單~
你還需要維護p[i][j]表示遊覽完景點i,還剩時間j,這種情況發生的概率;d[i][j]表示遊覽完景點i,還剩時間j,此時景點i的出度(顯然,乙個點的出度在不同時間是不一樣的。)現在你才能進行狀態轉移。
$f[i][k]=\sum +h[i]*p[i][k]$
答案就是所有出度為0的狀態的f之和(顯然它們的p之和=1,如果你的程式正確的話~)
#include #include #include #include using namespace std;typedef long double ld;
int n,m,t;
int map[110][110],t[110],h1[110],h2[110],d[110][500];
ld ans,ans1,ans2,p[110][500],f1[110][500],f2[110][500];
int rd()
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}int main()
f1[i][k]+=p[i][k]*h1[i];
f2[i][k]+=p[i][k]*h2[i];
if(!d[i][k]) ans+=p[i][k],ans1+=f1[i][k],ans2+=f2[i][k];
} }printf("%.5lf %.5lf",(double)ans1,(double)ans2);
return 0;
}
2018美團CodeM程式設計大賽初賽B輪 A題開關燈
美團的辦公室一共有n層,每層有m個會議室,可以看成是乙個n m的網格圖。工程師們每天的工作需要協作的地方很多,經常要到會議室開會解決各種問題。公司是提倡勤儉節約的,因此每次會議室只在使用時才開燈。當乙個工程師進入會議室時,假設沒有其他人,他會把燈開啟。當乙個工程師離開會議室時,假設沒有其他人,他會把...
美團CodeM初賽B輪 黑白樹 樹形結構貪心
一棵n個點的有根樹,1號點為根,相鄰的兩個節點之間的距離為1。樹上每個節點i對應乙個值k i 每個點都有乙個顏色,初始的時候所有點都是白色的。你需要通過一系列操作使得最終每個點變成黑色。每次操作需要選擇乙個節點i,i必須是白色的,然後i到根的鏈上 包括節點i與根 所有與節點i距離小於k i 的點都會...
CodeM美團初賽A輪 合併回文子串 dp
傳送門 輸入例子 2 aabb aaaaabcaa 輸出例子 4 5題解 dp,i代表a串開始的位置,j代表b串開始的位置,da,db分別代表在a和b中的長度,dp x y z h 代表 a中選下標為x到y 1的串 和 b中選z到h 1的串是否可以組合成回文串。利用每個字串的長度更新dp i i d...