题目

解析

看到这题,没想到 \(dp\)

果断打了暴力

暴力理应只有 \(30\) 左右的样子

然而我加上了些奇技淫巧竟然有 \(80\) 分!

惊到我了!

我 \(80\) 分的暴力:

很容易想到找到所有可找的路计算方差取最小值

然后发现计算方差的所有数中,最大最小差值越小越好

于是果断二分差值,然后枚举最大最小值

再 \(dfs\) 判断并计算答案

于是拿了 \(80\)

\(Code\)

#include<iostream>
#include<cstdio>
using namespace std; const int N = 55 , M = 305;
int n , m , tot , h[N] , Mx , up , down , pre[N] , edge[N] , flag;
double ans = 1e10;
struct Edge{
int to , nxt , z;
}e[M]; void dfs(int x , int up , int down)
{
if (x == n)
{
int t = x; double sum = 0 , an = 0 , s = 0;
while (pre[t]) sum += e[edge[t]].z , t = pre[t] , s++;
flag = 1 , sum /= s;
t = x , s = 0;
while (pre[t]) an += (sum - e[edge[t]].z) * (sum - e[edge[t]].z) , t = pre[t] , s++;
an /= s;
if (an < ans) ans = an;
return;
}
for(register int i = h[x]; i; i = e[i].nxt)
{
if (e[i].z >= down && e[i].z <= up)
{
pre[e[i].to] = x , edge[e[i].to] = i;
dfs(e[i].to , up , down);
pre[e[i].to] = edge[e[i].to] = 0;
}
}
} int main()
{
freopen("library.in" , "r" , stdin);
freopen("library.out" , "w" , stdout);
scanf("%d%d" , &n , &m);
int x , y , z;
for(register int i = 1; i <= m; i++)
{
scanf("%d%d%d" , &x , &y , &z);
e[++tot] = Edge{y , h[x] , z} , h[x] = tot;
Mx = max(Mx , z);
}
int l = 0 , r = Mx , mid;
while (l <= r)
{
mid = (l + r) >> 1;
flag = 0;
for(register int i = 0; i <= Mx - mid; i++)
{
down = i , up = i + mid;
for(register int j = 1; j <= n; j++) pre[j] = edge[j] = 0;
dfs(1 , up , down);
}
if (flag) r = mid - 1;
else l = mid + 1;
}
printf("%.4lf" , ans);
}

正解:其实我们可以先化解求方差的式子

方差就成了 \(\frac{\sum_{i=1}^s {x_i}^2}{n} - ave^2\)

其中 \(ave\) 为平均数,\(s\) 为经过边的个数,\(x_i\) 为边的权值

那么就是说我们最小化方差就只用最小化经过边的权值的平方的和

根据题中走的边数不超过 \(20\),也就是说 \(s \leq 20\)

我们可以 \(dp\) 了

设 \(f_{i,j,k}\) 表示经过 \(i\) 条边,到了 \(j\) 这个点,走过的路总距离为 \(k\) 时最小的平方和

那么 \(f_{i+1,to,k + l} = min(f_{i,j,k} + l^2)\)

最后答案就是最小的 \(f_{i,n,k}\)

\(Code\)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std; const int N = 55 , M = 305;
int n , m , tot , h[N] , f[25][55][1005];
double ans = 1e10;
struct Edge{
int to , nxt , z;
}e[M]; int main()
{
freopen("library.in" , "r" , stdin);
freopen("library.out" , "w" , stdout);
scanf("%d%d" , &n , &m);
int x , y , z;
for(register int i = 1; i <= m; i++)
{
scanf("%d%d%d" , &x , &y , &z);
e[++tot] = Edge{y , h[x] , z} , h[x] = tot;
}
memset(f , 0x3f3f3f , sizeof f);
f[0][1][0] = 0;
for(register int i = 0; i <= 20; i++)
for(register int j = 1; j <= n; j++)
for(register int l = 0; l <= 1000; l++)
for(register int k = h[j]; k; k = e[k].nxt)
if (l + e[k].z <= 1000) f[i + 1][e[k].to][l + e[k].z] = min(f[i + 1][e[k].to][l + e[k].z] , f[i][j][l] + e[k].z * e[k].z);
for(register int i = 1; i <= 20; i++)
for(register int j = 0; j <= 1000; j++)
ans = min(ans , (double)f[i][n][j] / (1.0 * i) - (1.0 * j / i) * (1.0 * j / i));
printf("%.4lf" , abs(ans));
}

JZOJ 3528. 【NOIP2013模拟11.7A组】图书馆(library)的更多相关文章

  1. JZOJ 3526. 【NOIP2013模拟11.7A组】不等式(solve)

    3526. [NOIP2013模拟11.7A组]不等式(solve) (File IO): input:solve.in output:solve.out Time Limits: 1000 ms M ...

  2. JZOJ 3509. 【NOIP2013模拟11.5B组】倒霉的小C

    3509. [NOIP2013模拟11.5B组]倒霉的小C(beats) (File IO): input:beats.in output:beats.out Time Limits: 1000 ms ...

  3. JZOJ 3508. 【NOIP2013模拟11.5B组】好元素

    3508. [NOIP2013模拟11.5B组]好元素(good) (File IO): input:good.in output:good.out Time Limits: 2000 ms  Mem ...

  4. JZOJ 3518. 【NOIP2013模拟11.6A组】进化序列(evolve)

    3518. [NOIP2013模拟11.6A组]进化序列(evolve) (File IO): input:evolve.in output:evolve.out Time Limits: 1000 ...

  5. JZOJ 3505. 【NOIP2013模拟11.4A组】积木(brick)

    3505. [NOIP2013模拟11.4A组]积木(brick) (File IO): input:brick.in output:brick.out Time Limits: 1000 ms Me ...

  6. [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)

    Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...

  7. JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨

    5236. [NOIP2017模拟8.7A组]利普希茨 (File IO): input:lipschitz.in output:lipschitz.out Time Limits: 1000 ms ...

  8. JZOJ 5235. 【NOIP2017模拟8.7A组】好的排列

    5235. [NOIP2017模拟8.7A组]好的排列 (File IO): input:permutation.in output:permutation.out Time Limits: 1000 ...

  9. JZOJ【NOIP2013模拟联考14】隐藏指令

    JZOJ[NOIP2013模拟联考14]隐藏指令 题目 Description 在d维欧几里得空间中,指令是一个长度为2N的串.串的每一个元素为d个正交基的方向及反方向之一.例如,d = 1时(数轴) ...

  10. [jzoj 5343] [NOIP2017模拟9.3A组] 健美猫 解题报告 (差分)

    题目链接: http://172.16.0.132/senior/#main/show/5343 题目: 题解: 记旋转i次之后的答案为$ans_i$,分别考虑每个元素对ans数组的贡献 若$s_i& ...

随机推荐

  1. Navicat mysql创建数据库、用户、授权、连接

    一.数据库的创建 调出命令窗口并创建数据库: create database itcast_oa default character set utf8;----创建数据库 二.数案件用户 create ...

  2. audio解决不能自动播放问题

    问题描述 无法实现打开网页就能自动播放音乐 正常情况下使用autoplay即可实现自动播放,但是现在打开网页该参数无效 原因分析: 根据最新的规范,Chrome系浏览器,没有交互过的网站默认禁止自动播 ...

  3. Spring Boot回顾

    一.概述 1.Spring的优缺点 优点 无需开发ELB,通过IOC和AOP,就可以使用POJO(简单的Java对象)实现ELB的功能 缺点: 依赖管理导入Maven耗时耗力 注解繁琐 2.Sprin ...

  4. 一个小时,200行代码,手写Spring的IOC、DI、MVC

    一.概述 配置阶段:主要是完成application.xml配置和Annotation配置. 初始化阶段:主要是加载并解析配置信息,然后,初始化IOC容器,完成容器的DI操作,已经完成HandlerM ...

  5. 更改json节点key

    json节点key更改,给朋友写的小tool,顺便记录一下 单个指定 每一个需要修改的key,都需要指定 /** * 需要转义的key对象 * 原key: 新key */ const jsonKeys ...

  6. Jekyll + GitHub Pages + Vercel纯免费搭建独立博客

    大家一定不要随便立flag 10月份发了个朋友圈,有好兄弟留言说写个教程,我说好 然后一忙起来就忘了,昨天好兄弟追到知识星球,在一个新flag帖子下催更了 写个无废话极简 VSCode 从这下载:ht ...

  7. [WPF]限制程序单例运行

    代码 System.Threading.Mutex mutex; protected override void OnStartup(StartupEventArgs e) { bool ret; m ...

  8. 无旋树堆(FHQ-Treap)学习笔记

    简介 无旋树堆(一般统称 \(\text{FHQ-Treap}\)),是一种平衡树.可以用很少的代码达到很优秀的复杂度. 前置知识: 二叉搜索树 \(\text{BST}\) \(\text{Trea ...

  9. Python面向对象(上)

    Python面向对象(上) python是一门面向对象的编程语言.何为对象?对象是类的实例.在生活中,任何一个事物都是一个对象,如牡丹花.牡丹花的类是花类,同样属于花类的还有荷花.月季花.金银花.菊花 ...

  10. 在spring boot3中使用native image

    目录 简介 安装GraalVM 添加Native Image支持 构建spring boot3应用 总结 简介 在之前spring boot3文章中我们介绍了,spring boot3的一个重要特性就 ...