【NOIP2016】换教室
題目描述
對于剛上大學(xué)的牛牛來說, 他面臨的第一個問題是如何根據(jù)實際情況中情合適的課程。
在可以選擇的課程中,有2n節(jié)課程安排在n個時間段上。在第 i ( 1≤ i≤n)個時同段上, 兩節(jié)內(nèi)容相同的課程同時在不同的地點進(jìn)行, 其中, 牛牛預(yù)先被安排在教室 ci上課, 而另一節(jié)課程在教室 di進(jìn)行。
在不提交任何申請的情況下,學(xué)生們需要按時間段的順序依次完成所有的n節(jié)安排好的課程。如果學(xué)生想更換第i節(jié)課程的教室,則需要提出中情。若申請通過,學(xué)生就可以在第 i個時間段去教室 di上課, 否則仍然在教室 ci上課。
由于更換教室的需求太多, 申請不一定能獲得通過。 通過計算, 牛牛發(fā)現(xiàn)申請更換第 i節(jié)課程的教室時, 中情被通過的概率是一個已知的實數(shù) ki, 并且對于不同課程的申請, 被通過的概率是互相獨立的。
學(xué)校規(guī)定, 所有的申請只能在學(xué)期開始前一次性提交, 并且每個人只能選擇至多m節(jié)課程進(jìn)行申請。 這意味著牛牛必須一次性決定是否申請更換每節(jié)課的教室, 而不能根據(jù)某些課程的申請結(jié)果來決定其他課程是否申請; 牛牛可以申請白己最希望更換教室的 m門課程,也可以不用完這m個中情的機(jī)會,甚至可以一門課程都不申請。
因為不同的課程可能會被安排在不同的教室進(jìn)行, 所以牛牛需要利用課問時間從一間教室趕到另一間教室。
牛牛所在的大學(xué)有 v個教室,有 e條道路。每條道路連接兩間教室, 并且是可以雙向通行的。 由于道路的長度和擁;i者程度不同, 通過不同的道路耗費(fèi)的體力可能會有所不同。當(dāng)?shù)趇 ( 1≤i≤n-1 )節(jié)課結(jié)束后,牛牛就會從這節(jié)課的教室出發(fā),選擇一條耗費(fèi)體力最少的路徑前往下一節(jié)課的教室。
現(xiàn)在牛牛想知道,申請哪幾門課程可以使他因在教室問移動耗費(fèi)的體力值的總和的期望值最小,請你幫他求出這個最小值。
輸入輸出格式
輸入格式:
?
第一行四個整數(shù) n,m,v,e 。 n表示這個學(xué)期內(nèi)的時間段的數(shù)量; m表示牛牛最多可以申請更換多少節(jié)課程的教室; v表示牛牛學(xué)校里教室的數(shù)量; e表示牛牛的學(xué)校里道路的數(shù)量。
第二行n個正整數(shù),第 i ( 1≤ i≤ n)個正整數(shù)表示c,,即第 i個時間段牛牛被安排上課的教室;保證1≤ ci≤ v。
第三行n個正整數(shù),第 i ( 1≤ i≤ n)個正整數(shù)表示di,即第 i個時間段另一間上同樣課程的教室;保證1≤ di≤ v。
第四行n個實數(shù),第 i ( 1≤ i≤ n)個實數(shù)表示ki,即牛牛申請在第 i個時間段更換教室獲得通過的概率。保證0≤ ki≤1 。
接下來 e行,每行三個正整數(shù)aj,bj,wj,表示有一條雙向道路連接教室 aj ,bj ,通過這條道路需要耗費(fèi)的體力值是 Wj ;保證1≤ aj,bj≤ v, 1≤ wj≤100 。
保證1≤n≤2000, 0≤m≤2000, 1≤v≤300, 0≤ e≤90000。
保證通過學(xué)校里的道路,從任何一間教室出發(fā),都能到達(dá)其他所有的教室。
保證輸入的實數(shù)最多包含3位小數(shù)。
?
輸出格式:
?
輸出一行,包含一個實數(shù),四舎五入精確到小數(shù)點后恰好2位,表示答案。你的
輸出必須和標(biāo)準(zhǔn)輸出完全一樣才算正確。
測試數(shù)據(jù)保證四舎五入后的答案和準(zhǔn)確答案的差的絕對值不大于4 *10^-3 。 (如果你不知道什么是浮點誤差, 這段話可以理解為: 對于大多數(shù)的算法, 你可以正常地使用浮點數(shù)類型而不用對它進(jìn)行特殊的處理)
?
輸入輸出樣例
輸入樣例#1:3 2 3 3 2 1 2 1 2 1 0.8 0.2 0.5 1 2 5 1 3 3 2 3 1 輸出樣例#1:
2.80
說明
【樣例1說明】
所有可行的申請方案和期望收益如下表:
【提示】
的是同一間教室。
2.請注意區(qū)分n,m,v,e的意義, n不是教室的數(shù)量, m不是道路的數(shù)量。
特殊性質(zhì)1:圖上任意兩點 ai, bi, ai≠ bi間,存在一條耗費(fèi)體力最少的路徑只包含一條道路。
特殊性質(zhì)2:對于所有的1≤ i≤ n, ki= 1 。
?
題解:
簡單期望dp 申請成功的申請失敗的都要算?
?
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=2005,INF=1999999999; 7 int n,m,v,e,c[N],d[N];double k[N],f[N][N][2],w[N][N]; 8 int main() 9 { 10 int x,y;double z; 11 scanf("%d%d%d%d",&n,&m,&v,&e); 12 for(int i=1;i<=n;i++)scanf("%d",&c[i]); 13 for(int i=1;i<=n;i++)scanf("%d",&d[i]); 14 for(int i=1;i<=n;i++)scanf("%lf",&k[i]); 15 for(int i=1;i<=v;i++) 16 for(int j=1;j<=v;j++) 17 w[i][j]=INF; 18 for(int i=1;i<=e;i++){ 19 scanf("%d%d%lf",&x,&y,&z); 20 if(w[x][y]==INF)w[x][y]=w[y][x]=z; 21 else if(z<w[x][y])w[x][y]=w[y][x]=z; 22 w[x][x]=0;w[y][y]=0; 23 } 24 for(int ka=1;ka<=v;ka++) 25 for(int i=1;i<=v;i++) 26 for(int j=1;j<=v;j++) 27 if(i!=j && i!=ka && j!=ka && w[i][ka]+w[ka][j]<w[i][j])w[i][j]=w[i][ka]+w[ka][j]; 28 for(int i=0;i<=n;i++) 29 for(int j=0;j<=m;j++) 30 f[i][j][0]=f[i][j][1]=INF; 31 f[1][0][0]=f[1][1][1]=0; 32 for(int i=2;i<=n;i++) 33 { 34 int pa=i<m?i:m; 35 f[i][0][0]=f[i-1][0][0]+w[c[i-1]][c[i]]; 36 for(int j=1;j<=pa;j++) 37 { 38 f[i][j][0]=min(f[i-1][j][0]+w[c[i-1]][c[i]],f[i-1][j][1]+w[d[i-1]][c[i]]*k[i-1]+w[c[i-1]][c[i]]*(1.0-k[i-1])); 39 f[i][j][1]=min(f[i-1][j-1][0]+w[c[i-1]][d[i]]*k[i]+w[c[i-1]][c[i]]*(1-k[i]),f[i-1][j-1][1]+w[d[i-1]][d[i]]*k[i]*k[i-1]+w[d[i-1]][c[i]]*k[i-1]*(1.0-k[i])+w[c[i-1]][d[i]]*(1.0-k[i-1])*k[i]+w[c[i-1]][c[i]]*(1.0-k[i])*(1.0-k[i-1])); 40 } 41 } 42 double ans=2e8; 43 for(int i=0;i<=m;i++)ans=min(min(ans,f[n][i][0]),f[n][i][1]); 44 printf("%.2lf",ans); 45 return 0; 46 }?
轉(zhuǎn)載于:https://www.cnblogs.com/Yuzao/p/6984861.html
總結(jié)
以上是生活随笔為你收集整理的【NOIP2016】换教室的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么成为日上会员直邮_18个日上直邮问题
- 下一篇: 快速排序2