题解 [美团 CodeM 初赛 Round B]景区路线规划
有个影响因素k,显然不能高斯消元
n和k都不大,可以直接\(O(nk)\)跑DP
然而带上时间这一影响因素后的转移颇为难写,我从6点直接调到9点最后还是只能dfs爆搜骗了55pts
考场上推方程一定要冷静,调不对再把影响因素都看一遍
我考场上纠结的是\(dp[k][i]\)在什么时候应该继承\(dp[k+1][i]\)
然而考完再看发现根本不需要继承。。。
还是考虑从多个点向一个点转移:
令\(dp[k][i]\)为还剩时间k时,在还剩时间k时经过第i个点次数的期望(实际上就是在第i个点时开心度的期望)
则转移就很显然了:\(dp[k][i] = \sum_{i->v}\frac{1}{cnt[v]}dp[k+c[i]+e.w][v]\)
然而这题还有一个坑点:题里没给边数范围
于是我就默认\(m\leq100\)了 成功RE
应该是不超过\(\frac{N*(N-1)}{2}\)条边
Code:
#include <bits/stdc++.h>
using namespace std;
#define N 110
#define ll long long
//#define int long long
inline int read() {
int ans=0, f=1; char c=getchar();
while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
return ans*f;
}
struct edge{int to, next, val;}e[N*(N-1)/2];
int n, m, k, K;
int head[N], size, cnt[500][N], c[N];
double dp[500][N], h1[N], h2[N]; // 0->小y 1->妹子
double ans1=0, ans2=0;
inline void add(int s, int t, int w) {edge *k=&e[++size]; k->to=t; k->next=head[s]; k->val=w; head[s]=size;}
int main()
{
#ifdef DEBUG
freopen("1.in", "r", stdin);
#endif
n=read(); m=read(); K=read();
for (int i=1; i<=n; ++i) {c[i]=read(); h1[i]=1.0*read(); h2[i]=1.0*read();}
for (int i=1,u,v,w; i<=m; ++i) {u=read(); v=read(); w=read(); add(u, v, w); add(v, u, w);}
for (int i=1; i<=n; ++i) if (K>=c[i]) dp[K-c[i]][i] = 1.0/n;
for (int k=K-1; k>=0; --k) {
for (int i=1; i<=n; ++i) {
if (k>K-c[i] || !dp[k][i]) continue;
for (int j=head[i],v,t; j; j=e[j].next) {
v=e[j].to; t=k-c[v]-e[j].val;
if (t>=0) ++cnt[k][i];
}
if (cnt[k][i]) {
for (int j=head[i],v,t; j; j=e[j].next) {
v=e[j].to; t=k-c[v]-e[j].val;
if (t>=0) dp[t][v] += dp[k][i]/cnt[k][i];
}
}
//dp[k][i] += dp[k+1][i];
ans1 += dp[k][i]*h1[i];
ans2 += dp[k][i]*h2[i];
}
}
#if 0
for (int k=K; k>=0; --k) {
cout<<setw(2)<<k<<' '; for (int i=1; i<=n; ++i) cout<<setw(4)<<dp[k][i]<<' '; cout<<endl;
cout<<setw(2)<<k<<' '; for (int i=1; i<=n; ++i) cout<<setw(4)<<cnt[k][i]<<' '; cout<<endl;
}
#endif
printf("%.5lf %.5lf\n", ans1, ans2);
return 0;
}
题解 [美团 CodeM 初赛 Round B]景区路线规划的更多相关文章
- #6164. 「美团 CodeM 初赛 Round A」数列互质-莫队
#6164. 「美团 CodeM 初赛 Round A」数列互质 思路 : 对这个题来言,莫队可以 n*根号n 离线处理出各个数出现个的次数 ,同时可以得到每个次数出现的次数 , 但是还要处理有多少 ...
- LiberOJ#6178. 「美团 CodeM 初赛 Round B」景区路线规划 概率DP
题意 游乐园被描述成一张 n 个点,m 条边的无向图(无重边,无自环).每个点代表一个娱乐项目,第 i 个娱乐项目需要耗费 ci 分钟的时间,会让小 y 和妹子的开心度分别增加 h1i ,h2i ,他 ...
- 【loj6177】「美团 CodeM 初赛 Round B」送外卖2 Floyd+状压dp
题目描述 一张$n$个点$m$条边的有向图,通过每条边需要消耗时间,初始为$0$时刻,可以在某个点停留.有$q$个任务,每个任务要求在$l_i$或以后时刻到$s_i$接受任务,并在$r_i$或以前时刻 ...
- 「美团 CodeM 初赛 Round A」最长树链
题目描述 Mr. Walker 最近在研究树,尤其是最长树链问题.现在树中的每个点都有一个值,他想在树中找出最长的链,使得这条链上对应点的值的最大公约数不等于1.请求出这条最长的树链的长度. 输入格式 ...
- loj6177 「美团 CodeM 初赛 Round B」送外卖2 最短路+状压dp
题目传送门 https://loj.ac/problem/6177 题解 一直不知道允不允许这样的情况:取了第一的任务的货物后前往配送的时候,顺路取了第二个货物. 然后发现如果不可以这样的话,那么原题 ...
- loj #6177. 「美团 CodeM 初赛 Round B」送外卖2 状压dp floyd
LINK:#6177.美团 送外卖2 一道比较传统的状压dp题目. 完成任务 需要知道自己在哪 已经完成的任务集合 自己已经接到的任务集合. 考虑这个dp记录什么 由于存在时间的限制 考虑记录最短时间 ...
- [美团 CodeM 初赛 Round A]数列互质
题目大意: 给出一个长度为n的数列a1,a2,a3,...,an,以及m组询问(li,ri,ki),求区间[li,ri]中有多少数在该区间中的出现次数与ki互质. 思路: 莫队. f[i]记录数字i出 ...
- [美团 CodeM 初赛 Round A]最长树链
题目大意: 给你一棵带点权的树,找出一个最长的树链满足链上点权的最大公因数不为1. 思路: 暴力DP. 对于每个点,记录一下以这个点为一个端点的所有链的最大公因数及长度. 然后暴力转移一下,时间复杂度 ...
- Loj #6164. 「美团 CodeM 初赛 Round A」数列互质
link : https://loj.ac/problem/6164 莫队傻题,直接容斥做. #include<bits/stdc++.h> #define maxn 100005 #de ...
随机推荐
- ESP32-简单OTA升级
基于ESP-IDF4.1 1 #include "freertos/FreeRTOS.h" 2 #include "freertos/task.h" 3 #in ...
- 长按短按控制LED灯-ESP32中断处理
#include <stdio.h> #include <string.h> #include <stdlib.h> #include "freertos ...
- Java | Map集合
Map集合 在现实生活中,有非常多的东西,是和另外一种东西对应的,并且还是唯一的,比如:身份证号与个人,个人与手机,一夫一妻...等,这种关系就是对应关系,又叫做映射.Java为这种数据类型提供了专门 ...
- Lua表达式
目录 算术运算符 关系运算符 逻辑运算符 字符串连接(more) string.format转义符的使用 优先级 算术运算符 Lua 的算术运算符如下表所示: 示例代码:$expr1.lua prin ...
- F5负载均衡_monitors(健康检查)
故障现象: 后端有5台服务器,每个服务器上跑着8个应用.使用F5做应用负载调度.这40个应用里面,3-10个应用在高峰期的时候weblogic的DOS窗口显示与数据库断开连接(端口通.业务断),但是F ...
- python02篇 字典、元组、切片
一.字典 1.1 字典的常用方法 # 字典 数据类型 {} key-value # list是挨个循环查找,字典是根据key查找value,比list遍历效率高 d = { 'username': ' ...
- 路由算法(Dijkstra算法以及遗传算法)
(1)Dijkstra算法 1 class Dijkstra(Algorithm): 2 """Dijkstra algorithm for unicast route ...
- 二、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Modules的几种加载方式
这一篇梳理Prism中07示例Module的几种加载方式. 07示例分为了5个,有5种不同的Module加载方式. 我们开始学习加载Modules 观察07-Modules-Appconfig示例 分 ...
- EXCEL:宏 考场考号打印
Sub addwork() Rem 当前宏是根据学生数量 .每考场人数计算工作表数Dim i As IntegerRem xx为每个考场的人数Rem yy为当前专业标记Rem mm为当前专业考生人数R ...
- ACM金牌选手讲解LeetCode算法《栈和队列的高级应用》
大家好,我是编程熊,双非逆袭选手,字节跳动.旷视科技前员工,ACM金牌,保研985,<ACM金牌选手讲解LeetCode算法系列>作者. 上一篇文章讲解了<线性表>中的数组.链 ...