【NOIP2016提高组day1】†换教室

来源:互联网 发布:微信小程序java服务端 编辑:程序博客网 时间:2024/04/28 00:05

题目

对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的
课程。
在可以选择的课程中,有 2n 节课程安排在 n 个时间段上。 在第 i ( 1 ≤ i ≤ n )个 时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 ci 上课,而另一节课程在教室 di 进行。
在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的 n 节安排好的课程。如果学生想更换第i节课程的教室,则需要提出申请。若申请通过,学生就可以在第 i 个时间段去教室 di 上课,否则仍然在教室 ci 上课。由于更换教室的需求太多,申请不一定能获得通过。 通过计算,牛牛发现申请更 换第 i 节课程的教室时,申请被通过的概率是一个己知的实数 ki ,并且对于不同课程 的申请,被通过的概率是互相独立的。
学校规定,所有的申请只能在学期开始前一次性提交,并且每个人只能选择至多m节课程进行申请。 这意味着牛牛必须一次性决定是否申请更换每节课的教室,而不能根据某些课程的申请结果来决定其他课程是否申请;牛牛可以申请自己最希望更换教室的 m 门课程,也可以不用完这 m 个申请的机会,甚至可以一门课程都不申请。 因为不同的课程可能会被安排在不同的教室进行,所以牛牛需要利用课间时间从 一间教室赶到另一间教室。 牛牛所在的大学有 v 个教室,有 e 条道路。 每条道路连接两间教室,并且是可 以双向通行的。
由于道路的长度和拥堵程度不同,通过不同的道路耗费的体力可能会有所不同。 当第 i ( 1 ≤ i ≤ n − 1 )节课结束后,牛牛就会从这节课的教室出发,选择一条耗费体力最少的路径前往下一节课的教室。现在牛牛想知道,申请哪几门课程可以使他因在教室间移动耗费的体力值的总和的期望值最小,请你帮他求出这个最小值。
现在牛牛想知道,申请哪几门课程可以使他因在教室间移动耗费的体力值的总和的期望值最小,请你帮他求出这个最小值。

分析

这道题其实只要熟悉期望的求法,而且脑子没有炸掉都可以想出来(反正我脑子是炸掉了)
首先用floyd将教室两两间到达的距离求出来。
求期望,搞个dp,
fi,j,0|1表示做到第i节课,用了j次申请,这节课有没有申请(k=0表示没有,反之),的最小期望值。
转移很容易,就是有点麻烦甚至恶心:

f[i][j][0]=min(f[i][j][0],f[i-1][j][0]+dis[a[i-1][0]][a[i][0]]);            if(j>=1)            {                f[i][j][0]=min(f[i][j][0],                    (f[i-1][j][1]+dis[a[i-1][1]][a[i][0]])*s[i-1]+                    (f[i-1][j][1]+dis[a[i-1][0]][a[i][0]])*(1-s[i-1]));                f[i][j][1]=min(f[i][j][1],                    (f[i-1][j-1][0]+dis[a[i-1][0]][a[i][1]])*s[i]+                    (f[i-1][j-1][0]+dis[a[i-1][0]][a[i][0]])*(1-s[i]));                if(j>=2)                {                    f[i][j][1]=min(f[i][j][1],                        (f[i-1][j-1][1]+dis[a[i-1][1]][a[i][1]])*s[i]*s[i-1]+                        (f[i-1][j-1][1]+dis[a[i-1][1]][a[i][0]])*(1-s[i])*s[i-1]+                        (f[i-1][j-1][1]+dis[a[i-1][0]][a[i][1]])*s[i]*(1-s[i-1])+                        (f[i-1][j-1][1]+dis[a[i-1][0]][a[i][0]])*(1-s[i])*(1-s[i-1]));                }            }
1 0
原创粉丝点击