【洛谷】P4202 [NOI2008]奥运物流

感觉有点降智

首先设环长为\(len\),很容易推导出

\[R(1) = \frac{\sum_{i = 1}^{N} C_{i} k^{dep[i]}}{1 - k^{len}}
\]

我好像觉得似乎\(len\)越大底下越小了,太降智了,len越大底下越大

所以环长越小越好,所以我们如果动了一条环边,就是把它尽量往1连

枚举环上,强制要求环上上的点不选,除开1到1的后继的那条边,我们就获得了一棵树

我们希望\(dp\)出改了m个点最大是多少,显然改就一定直接连到1

设\(f[u][j][d]\)为\(u\)这个点,子树里改了\(j\)个点,我们硬点\(u\)到\(1\)的距离是\(d\)

转移的话分\(u\)有没有被连到1

如果被连到1了,那么就从\(max(f[v][k][1],f[v][k][2])\)转移过来,要加上\(C_{u} \times K\)

否则就从\(max(f[v][k][d + 1],f[v][k][1])\)转移过来,要加上\(C_{u} \times K^{d}\)

第二维是个背包,直接做就行了

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define ba 47
#define MAXN 5005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int N,M;
int fa[65];
db K[65],C[65],f[65][65][65],g[65];
bool nouse[65];
void dfs(int u,int dep) {
for(int v = 2 ; v <= N ; ++v) {
if(fa[v] == u) dfs(v,dep + 1);
}
for(int d = dep ; d >= min(dep,2) ; --d) {
memset(g,0,sizeof(g));
for(int v = 1 ; v <= N ; ++v) {
if(fa[v] == u) {
for(int j = M ; j >= 0 ; --j) {
for(int k = j ; k >= 0 ; --k) {
g[j] = max(g[j],g[k] + max(f[v][j - k][d + 1],f[v][j - k][1]));
}
}
}
}
for(int j = 0 ; j <= M ; ++j) f[u][j][d] = g[j] + C[u] * K[d];
}
if(!nouse[u] && fa[u] != 1) {
memset(g,0,sizeof(g));
for(int v = 1 ; v <= N ; ++v) {
if(fa[v] == u) {
for(int j = M ; j >= 0 ; --j) {
for(int k = j; k >= 0 ; --k) {
g[j] = max(g[j],g[k] + max(f[v][j - k][2],f[v][j - k][1]));
}
}
}
}
for(int j = 0 ; j < M ; ++j) f[u][j + 1][1] = g[j] + C[u] * K[1];
}
}
void Init() {
read(N);read(M);scanf("%lf",&K[1]);
for(int i = 1 ; i <= N ; ++i) {
read(fa[i]);
}
K[0] = 1;
for(int i = 2 ; i <= N ; ++i) {
K[i] = K[i - 1] * K[1];
}
for(int i = 1 ; i <= N ; ++i) {
scanf("%lf",&C[i]);
}
}
void Solve() {
int p = 1;
db ans = 0;
for(int len = 2 ; len ; ++len) {
p = fa[p];
if(p == 1) break;
memset(nouse,0,sizeof(nouse));
int t = 1,l = 0;
while(l != len) {
nouse[t] = 1;
t = fa[t];
++l;
}
int rec = 0;
if(fa[p] != 1) {--M;rec = fa[p];fa[p] = 1;}
memset(f,0,sizeof(f));
dfs(1,0);
db res = f[1][M][0] / (1 - K[len]);
ans = max(ans,res);
if(rec) {++M;fa[p] = rec;} }
printf("%.2lf\n",ans);
}
int main(){
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
Solve();
}

【洛谷】P4202 [NOI2008]奥运物流的更多相关文章

  1. bzoj 1065: [NOI2008] 奥运物流

    1065: [NOI2008] 奥运物流 Description 2008北京奥运会即将开幕,举国上下都在为这一盛事做好准备.为了高效率.成功地举办奥运会,对物流系统 进行规划是必不可少的.物流系统由 ...

  2. [NOI2008]奥运物流

    题目 洛谷 BZOJ 做法 单环有向图毒瘤题 不考虑环和改变后继:\(\sum\limits{i=1}^n C_i\cdot K^{dep(i)}\) 考虑环无穷等比求极m:\(R(1)=\sum\l ...

  3. 1065: [NOI2008]奥运物流 - BZOJ

    Sample Input4 1 0.52 3 1 310.0 10.0 10.0 10.0Sample Output30.00 推荐题解:http://blog.csdn.net/whjpji/art ...

  4. 洛谷P3980 [NOI2008]志愿者招募

    题解 最小费用最大流 每一天是一条边\((inf-a[i], 0)\) 然后对于一类志愿者, 区间两端连一条\((inf, c[i])\) \(S\)向第一个点连\((inf, 0)\) 最后一个点向 ...

  5. 【洛谷 P1772】 [ZJOI2006]物流运输(Spfa,dp)

    题目链接 \(g[i][j]\)表示不走在\(i\text{~}j\)时间段中会关闭的港口(哪怕只关\(1\)天)从\(1\)到\(m\)的最短路. \(f[i]\)表示前\(i\)天的最小花费.于是 ...

  6. 洛谷 P1477 [NOI2008]假面舞会

    题目链接 题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方 ...

  7. 【BZOJ1065】【NOI2008】奥运物流(动态规划)

    [BZOJ1065][NOI2008]奥运物流(动态规划) 题面 BZOJ 洛谷 题解 先不考虑环的情况,于是变成了一棵树. 这样子我们答案的贡献是\(\sum_{i=1}^nC_i\times k^ ...

  8. 【洛谷】P3980 [NOI2008]志愿者招募

    [洛谷]P3980 [NOI2008]志愿者招募 我居然现在才会用费用流解线性规划-- 当然这里解决的一类问题比较特殊 以式子作为点,变量作为边,然后要求就是变量在不同的式子里出现了两次,系数一次为+ ...

  9. 洛谷 P1656 炸铁路

    P1656 炸铁路 题目提供者kkksc03 标签图论搜索/枚举洛谷原创 难度普及/提高- 题目描述 因为某国被某红色政权残酷的高压暴力统治.美国派出将军uim,对该国进行战略性措施,以解救涂炭的生灵 ...

随机推荐

  1. 2018 Nowcoder Multi-University Training Contest 2

    目录 Contest Info Solutions A. run D. monrey G. transform H. travel I. car J. farm Contest Info Practi ...

  2. 数据结构实验之栈与队列二:一般算术表达式转换成后缀式(SDUT 2132)

    题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; int ok(char ch, char ...

  3. Selenium执行cdp命令,driver.execute_cdp_cmd用法

    Chrome自带的开发者工具DevTools功能非常强大.有时候我们在使用Selenium操作浏览器时需要通过调用一下DevTools的方法来完成一些设置,如模拟移动设备,弱网模拟等等. Seleni ...

  4. pandas入门之Series

    一.创建Series 参数 - Series (Series)是能够保存任何类型的数据(整数,字符串,浮点数,Python对象等)的一维标记数组.轴标签统称为索引. - data 参数 - index ...

  5. CF1208B

    CF1208B 题意: 给出n个数字,找出最小的一端连续区间进行删除操作,使其剩余元素不含重复元素,求要删除的最小区间长度 解法: 删除子段后,前缀和后缀保持不变,可能长度为0.让我们修复不包含任何重 ...

  6. 【Golang】嗅探抓包,解决线上偶现问题来不及抓包的情况

    背景 测试群里经常看到客户端的同学反馈发现了偶现Bug,但是来不及抓包,最后不了了之,最近出现得比较频繁,所以写个小脚本解决这个问题. 实现思路 实现的思路比较简单: 抓包 存日志 做日志管理 具体实 ...

  7. asp.net core 控制静态文件的授权

    静态文件访问在网站中是一项重要的服务,用于向前端提供可以直接访问的文件,如js,css,文档等,方法是在Startup的Configure中添加UseStaticFiles()管道. 参考:ASP.N ...

  8. 如何把Java的double类型变量保留两位小数

    已知 双精度标量 f,  如果想以字符串形式输出,小数点后保留2位,可直接通过C语言的输出格式,System.out.printf("%.2f", f), 达到目的. 如果想要先转 ...

  9. react hook的todolist

    感觉好长时间没写博客一样,app.js代码 import React from 'react'; import { useState } from 'react'; function App() { ...

  10. cnpm与npm指定有什么区别?

    CNPM跟NPM用法完全一致,只是在执行命令时将故宫改为CNPM. 因为故宫安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果故宫的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事来自 ...