【题解】NOIP2016换教室
哇好开心啊!写的时候真的全然对于这个加法没有把握,但还是大着胆子试着写了一下——竟然过了样例?于是又调了一下就过啦。
不过想想也觉得是正确的吧,互相独立的事件对于期望的影响自然也是相互独立的,可以把所有的情况看成一个整体,不同的统计方式只是分组的区别,最后算出来的答案肯定是一样的。dp的状态比较显然:dp[i][j][0/1]代表当前在第i节课,已经用去了j次申请的机会,0/1分别代表当前这一节课是否申请。那么这个时候就分情况讨论,计算这一次的选择对于答案的影响。
这些不同的情况分别是:当前和上一次是否选择申请换课,申请换课的是否成功。
期望的计算式:成功的概率*成功的代价+失败的概率*失败的代价。
#include <bits/stdc++.h>
using namespace std;
#define maxn 2050
#define INF 1047483640
#define maxm 2050
#define maxv 400
int n, m, v, e, dis[maxv][maxv], c[maxn], d[maxn];
double ans = , dp[maxn][maxm][], k[maxn]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void init()
{
for(int i = ; i <= v; i ++)
for(int j = i + ; j <= v; j ++)
dis[i][j] = dis[j][i] = INF; for(int i = ; i <= n; i ++)
for(int j = ; j <= m; j ++)
dp[i][j][] = dp[i][j][] = INF;
} double gmin(double &x, double y)
{
x = (x < y) ? x : y;
} int gmin2(int &x, int y)
{
x = (x < y) ? x : y;
} void Floyd()
{
for(int k = ; k <= v; k ++)
for(int i = ; i <= v; i ++)
for(int j = ; j <= v; j ++)
gmin2(dis[i][j], dis[i][k] + dis[k][j]);
} int main()
{
n = read(), m = read(), v= read(), e = read();
for(int i = ; i <= n; i ++) c[i] = read();
for(int i = ; i <= n; i ++) d[i] = read();
init();
dp[][][] = dp[][][] = ;
for(int i = ; i <= n; i ++) scanf("%lf", &k[i]);
for(int i = ; i <= e; i ++)
{
int x = read(), y = read(), z = read();
dis[x][y] = dis[y][x] = min(dis[y][x], z);
}
for(int i = ; i <= v; i ++) dis[i][i] = ;
Floyd();
for(int i = ; i <= v; i ++)
dis[i][] = dis[][i] = ;
c[] = d[] = , k[] = ;
for(int i = ; i <= n; i ++)
for(int j = ; j <= m; j ++)
{
gmin(dp[i][j][], dp[i - ][j][] + dis[c[i]][c[i - ]]);
gmin(dp[i][j][], dp[i - ][j][] + dis[c[i]][c[i - ]] * ( - k[i - ]) + dis[c[i]][d[i - ]] * k[i - ]);
if(j) gmin(dp[i][j][], dp[i - ][j - ][] + dis[c[i]][c[i - ]] * ( - k[i]) + dis[d[i]][c[i - ]] * k[i]);
double tem = ;
tem += dis[c[i]][c[i - ]] * ( - k[i]) * ( - k[i - ]);
tem += dis[c[i]][d[i - ]] * ( - k[i]) * k[i - ];
tem += dis[d[i]][c[i - ]] * k[i] * ( - k[i - ]);
tem += dis[d[i]][d[i - ]] * k[i] * k[i - ];
if(j) gmin(dp[i][j][], dp[i - ][j - ][] + tem);
}
for(int i = ; i <= m; i ++)
gmin(ans, min(dp[n][i][], dp[n][i][]));
printf("%.2lf", ans);
return ;
}
【题解】NOIP2016换教室的更多相关文章
- [NOIP2016]换教室 题解(奇怪的三种状态)
2558. [NOIP2016]换教室 [题目描述] 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1< ...
- [NOIP2016]换教室 D1 T3 Floyed+期望DP
[NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...
- BZOJ 4720 [Noip2016]换教室
4720: [Noip2016]换教室 Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i( ...
- 【BZOJ】4720: [Noip2016]换教室
4720: [Noip2016]换教室 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1690 Solved: 979[Submit][Status ...
- bzoj4720: [Noip2016]换教室(期望dp)
4720: [Noip2016]换教室 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1294 Solved: 698[Submit][Status ...
- 【bzoj4720】[NOIP2016]换教室
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内容相同的课程同时在不同的 ...
- [NOIP2016]换教室(概率期望$DP$)
其实吧我老早就把这题切了--因为说实话,这道题确实不难啊--李云龙:比他娘的状压DP简单多了 今天我翻以前在Luogu上写的题解时,突然发现放错代码了,然后被一堆人\(hack\)--蓝瘦啊\(ORZ ...
- 【bzoj4720】[NOIP2016]换教室 期望dp
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内容相同的课程同时在不同的 ...
- [NOIp2016] 换教室
题目类型:期望\(DP\) 传送门:>Here< 题意:现有\(N\)个时间段,每个时间段上一节课.如果不申请换教室,那么时间段\(i\)必须去教室\(c[i]\)上课,如果申请换课成功, ...
- NOIP2016换教室 BZOJ 4720
BZOJ 4720 换教室 题目描述: 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节 课程安排在n个时间段上.在第i(1≤i≤n)个时间段上 ...
随机推荐
- 云监控自定义HTTP状态码说明
您在使用站点监控时,返回的6XX状态码均为云监控自定义HTTP状态码,具体含义如下表所示: 状态码 含义 备注 610 HTTP连接超时 监测点探测您的网站时出现连接超 ...
- 【php学习-4】
var_1=11; print $var1->var_1.$var2->var_1; ?> print_Color(); ?> y=self::$x; # code... } ...
- [原]解决phpstudy下的nginx无法运行的问题
一直在用phpstudy下的apache,今天忽然想切换到nginx,出现了一些错误,最终还是解决了. 之前是php 5.3 + apache 现在是php 5.3n + nginx 问题就出在这n上 ...
- 利用phpspreadsheet切割excel大文件
背景: 利用phpspreadsheet可以轻松的解析excel文件,但是phpspreadsheet的内存消耗也是比较大的,我试过解析将近5M的纯文字excel内存使用量就会超过php默认的最大内存 ...
- css文本截字,超出文本省略号显示
一.单行文本截字 p { text-overflow: ellipsis;/*显示省略号代替裁剪的文本*/ white-space: nowrap;/*空白处理方式 不换行*/ overflow: h ...
- 在python中安装basemap
在python中安装basemap 1. 确保python环境安装完毕且已配置好环境变量 2. 安装geos: pip install geos 3. 下载.whl文件: (1)pyproj‑1.9. ...
- 码云配置webhooks自动触发拉取代码
webhooks的使用 码云和github的钩子叫webhooks 每次您 push 代码后,都会给远程 HTTP URL 发送一个 POST 请求 码云项目管理页面的webhooks设置: http ...
- python装饰器+递归+冒泡排序
冒泡排序 li = [33, 2, 10, 1,23,23523,5123,4123,1,2,0] for k in range(1,len(li)): for i in range(len(li) ...
- 「LibreOJ#516」DP 一般看规律
首先对于序列上一点,它对答案的贡献只有与它的前驱和后驱(前提颜色相同)构成的点对, 于是想到用set维护每个颜色,修改操作就是将2个set暴力合并(小的向大的合并),每次插入时更新答案即可 颜色数要离 ...
- C#中Equals和= =(等于号)的比较)(转载)
C#中Equals和= =(等于号)的比较) 相信很多人都搞不清Equals和 = =的区别,只是零星的懂一点,现在就让我带大家来进行一些剖析 一. 值类型的比较 对于值类型来说 ...