NOIP 2016 提高組 換教室

2021-07-25 01:35:04 字數 1575 閱讀 2447

先用弗洛伊德求出兩兩點的最短路,

設dp: fi

,j,0

表示當前走到了i這個點,申請了j次,在原點的期望距離, fi

,j,1

表示當前走到了i這個點,申請了j次,在申請點的期望距離(當然要加上沒有申請成功走到原點的期望距離),

轉移:

設ds(0/1,0/1)表示從上一輪的原點/申請點到當前的原點/申請點距離, bi

表示i這個點申請成功的機率。 fi

,j,0

=min(f

i−1,

j,0+

ds(0

,0),

fi−1

,j,1

+bi−

1∗ds

(1,0

)+(1

−bi−

1)∗d

s(0,

0))

fi,j

,1=min(f

i−1,

j−1,

0+ds

(0,1

)∗bi

+ds(

0,0)

∗(1−

bi),

(這個太

麻煩了,

讀者自己

到標程中

看吧))

複雜度:o(

n2)

#include 

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define ds(q,w) (dis[a[i-1][q]][a[i][w]])

using

namespace

std;

typedef

double db;

const

int n=2050;

int n,m,m1;

int a[n][2];

db b[n];

int dis[n][n];

db f[n][n][2];

db ans;

int min(int q,int w)

fo(i,1,m1)dis[i][i]=0,dis[0][i]=0;

fo(k,1,m1)fo(i,1,m1)if(i!=k)

fo(j,1,m1)if(j!=i&&j!=k)dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);

memset(f,127,sizeof(f));

f[1][0][0]=f[1][1][1]=0;

ans=1e9;

fo(i,2,n)

fo(j,0,min(i,m))

}ans=f[n][0][0];

fo(i,1,min(m,n))ans=min(ans,min(f[n][i][0],f[n][i][1]));

printf("%.2lf\n",ans);

return

0;}

NOIP2016提高組 換教室

題面很長,實質很水的一道期望dp題。題面自帶勸退效果。首先用floyd算出任意兩點的最短路徑。然後設f i,j,0 為前i節課申請更換j節,且不申請第i節時的最小期望 設f i,j,1 前i節課申請更換j節,且申請第i節時的最小期望。可得下面這個超長的狀轉方程 f i,j,0 min f i,j,1...

NOIP2016提高組day1 換教室

對於剛上大學的牛牛來說,他面臨的第乙個問題是如何根據實際情況申請合適的 課程。在可以選擇的課程中,有 2n 節課程安排在 n 個時間段上。在第 i 1 i n 個 時間段上,兩節內容相同的課程同時在不同的地點進行,其中,牛牛預先被安排在教室 ci 上課,而另一節課程在教室 di 進行。在不提交任何申...

2016 NOIP提高組 換教室 題解

題目傳送門 題目大意 牛牛要上 n nn 天課,第 i ii 天在 c i c i c i 號教室,可以申請換至多 m mm 天的教室,第 i ii 天有 p i p i p i 的申請成功機率,申請成功的話就可以在 d i d i d i 號教室上課,第 i ii 天上完課後要走到第 i 1 i ...