呆子打算去上自習,雖然他不願意。他來到五教門口時,發現他來遲了,事先又沒有佔位子,可能沒有位子了。
根據經驗,他知道每個小教室有位子的概率為p1,每個梯形教室有位子的概率為p2,每個扇形教室有位子得概率為p3。
由於他並不是真的想上自習,所以他並不打算到每個教室去找位子,而是選一條從前門走到後門的路徑,路過乙個教室就進去看看,如果有位子就只好自習,如果沒有就繼續向前,直到後門還沒有找到位子就回去睡覺。
現在他希望你替他找到一條路徑,使得他回去睡覺的概率最大。
輸入的第一行是1個整數n ( 1<=n<=100 ),表示五教共有n個教室,編號為1,2,3 ... n。
第2行是三個實數p1 p2 p3 ( 0 <= p1 p2 p3 <=1,精度為0.01 )。
第3到2+n為一列整數:
i c s1 s2 m a1 a2 a3 .... am
其中 i為教室編號。
c 的值為0,1或2,分別表示i號教室為小/梯形/扇形教室。
若i號教室與前門直接相鄰,則s1=1,否則s1=0。
若i號教室與後門直接相鄰,則s2=1,否則s2=0。
a1 a2 ..... am 是與第i個教室直接相鄰的教室編號。
所謂直接相鄰,是指兩個教室之間或大門與教室之間存在一條不經過其他教室或大門的路。
保證至少存在一條從前門到後門的道路
輸出一行,包含乙個實數,表示呆子回去睡覺的最大概率。四捨五入到0.01。
題目很長,其實就是求一條最長路
對於所有直接與前門相連的點,我們都先丟入佇列,概率為該教室沒有座位的概率
跑一次最長路,最後查詢所有與後門直接相連的教室的最大概率
#include#include#include#include#includeusing namespace std;
int n,c[105],a[105][105],s[105],s2[105];
double p[3],f[105],ans;
bool vis[105];
queueq;
int main()
for(int i=1;i<=n;i++) if(s[i]) q.push(i),vis[i]=1,f[i]=1-p[c[i]];
while(!q.empty())
}} for(int i=1;i<=n;i++) if(s2[i]) ans=max(ans,f[i]);
printf("%0.2lf",ans);
}
最短路 記錄路徑 變形!!
時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。...
變形最短路
有沒有感覺神似 acmer的出行計畫 我們知道dijkstra是貪心策略的dp嘛,貪心的是距離 然而有時除了距離還有別的限制,在這裡是油。這時候花費最小不一定是最優,還要考慮剩餘的油 dp i,j 表示到i點時剩餘j油時最少的花費 在乙個點可以選擇向下走 油夠的情況 或者加1份油 多次加乙份油就相當...
dij最短路 變形
時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。...