[Luogu 1850] noip16 换教室
[Luogu 1850] noip16 換教室
好久沒有更博客了,先嘮嗑一會,花了兩天的空閑時間大致做完了昨年的noip真題
雖然在經(jīng)過思考大部分題目都可出解(天天愛跑步除外),但是并不知道考試時候造化如何。
總之自己這段時間多做好事,多積攢RP,每天RP++
Description
Solution:
首先當(dāng)你看完這個到題的時候,你應(yīng)該想到先用floyd跑出任意兩點(diǎn)的最短路,這個不解釋
然后又是這種求期望值最小,很明顯也會想到DP的做法
那么DP的方程?通過發(fā)現(xiàn)對于當(dāng)前第i個課程教室的期望是跟前一個課程的選擇與否有關(guān)的,
那么最后我們的狀態(tài)可以表示為 f[n][m][0..1]
接下去就比較容易了,只是需要耐心仔細(xì)的分類討論
1、當(dāng)前的課不換的情況:
(1)上一節(jié)課也沒換;
(2)上一節(jié)課換了----成功 or 不成功;
2、當(dāng)前的課換的情況:
(1)當(dāng)前課成功換了:
a、上一節(jié)課換了----上一節(jié)課成功 or 不成功
b、上一節(jié)課沒換;
(2)當(dāng)前的課換了失敗:
a、上一節(jié)課換了----上一節(jié)課成功 or 不成功
b、上一節(jié)課沒換;
最后總結(jié)一下就是
那么就完成了
注意:轉(zhuǎn)移時候因為多次出現(xiàn)距離可預(yù)先用cc,cd,dc,dd來表示 c[i-1] 到 c[i] 等等的距離
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=,M=;
int c[M],d[M],dis[N][N],x,y,z,n,m,v,e;
double f[M][M][],k[M];
int main(){
scanf("%d%d%d%d",&n,&m,&v,&e);
for (int i=;i<=n;++i) scanf("%d",&c[i]);
for (int i=;i<=n;++i) scanf("%d",&d[i]);
for (int i=;i<=n;++i) scanf("%lf",&k[i]);
for (int i=;i<=v;++i) for (int j=;j<=v;++j) dis[i][j]=1e9;
for (int i=;i<=e;++i)
scanf("%d%d%d",&x,&y,&z),dis[x][y]=dis[y][x]=min(dis[x][y],z);
for (int i=;i<=v;++i) dis[i][i]=;
for (int kkk=;kkk<=v;++kkk)
for (int i=;i<=v;++i) if (i!=kkk)
for (int j=;j<=v;++j)
if (i!=j&&j!=kkk) dis[i][j]=min(dis[i][kkk]+dis[kkk][j],dis[i][j]);
for (int i=;i<=n;++i) for (int j=;j<=m;++j) f[i][j][]=f[i][j][]=1e9;
f[][][]=f[][][]=0.00; f[][][]=0.00;
for (int i=;i<=n;++i){
int cc=dis[c[i-]][c[i]],cd=dis[c[i-]][d[i]],dc=dis[d[i-]][c[i]],dd=dis[d[i-]][d[i]];
f[i][][]=f[i-][][]+cc;
for (int j=;j<=min(i,m);++j){
f[i][j][]=min(f[i-][j][]+cc,f[i-][j][]+cc*(-k[i-])+dc*k[i-]); f[i][j][]=min(f[i-][j-][]+cd*k[i]+cc*(-k[i]),
f[i-][j-][]+cc*(-k[i-])*(-k[i])+cd*(-k[i-])*k[i]+
dc*k[i-]*(-k[i])+dd*k[i-]*k[i]);
}
}
double ans=1e9;
for (int i=;i<=m;++i)
ans=min(ans,min(f[n][i][],f[n][i][]));
printf("%.2lf",ans);
}
總結(jié)
以上是生活随笔為你收集整理的[Luogu 1850] noip16 换教室的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SSH学习之中的一个 OpenSSH基本
- 下一篇: 为什么人肉叫白肉?