题目

解析

看到这题,没想到 \(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. [论文阅读] 颜色迁移-Linear Monge-Kantorovitch(MKL)

    [论文阅读] 颜色迁移-Linear Monge-Kantorovitch(MKL) 文章: The Linear Monge-Kantorovitch Linear Colour Mapping f ...

  2. 【知识体系】Kafka文档汇总、组成及架构,配置,常见名词解释,命令行及api操作,官方文档内容,各部分深入,zookeeper和security,监控和运维

    〇.相关资料 1.快速搭建文档: 2.详细讲义 3.在线官方文档:http://kafka.apache.org/documentation/ 4.Kafka知识个人总结 5.KafkaPPT汇报 链 ...

  3. 【Java】二分查找标准代码

    太菜了..写不出正确的... 干脆放一个标准代码,之后参考 boolean BinarySearch(int[] m){ int l=0,r=m.length-1;//减1相当于数组两头(lr都能指到 ...

  4. Day38:Lambda表达式

    Lambda表达式 1.1 概述 Lambda是JDK8开始后的一种新语法形式. 作用:简化函数式匿名内部类的代码写法. 简化格式: /*部类被重写方法的参数)->{ 被重写方法的方法体代码 } ...

  5. 使用命令行运行用例时提示python.exe: Error while finding module specification for 'testcase_1.Test'.....

    文件路径 输入命令 D:\demo>python -m unittest unittest_1/testcase_1.Test结果提示 ModuleNotFoundError: No modul ...

  6. django.core.exceptions.ImproperlyConfigured: Field name `tester_id` is not valid for model `WebCase`.

    代码: class WebCase(models.Model): id = models.AutoField(primary_key=True) casename = models.CharField ...

  7. C#代码扫描工具Sonarqube + Win10+SqlServer2017

    在之前的公司, 看到有用过代码扫描工具, 扫描C#代码, 最近公司也有考虑做这个,于是我便独自研究了一下,这里给大家做个分享 网上找了很多资料, 主要有以下问题: 1. Sonarqube用的是 旧版 ...

  8. Hadoop详解(04)-Hdfs

    Hadoop详解(04)-Hdfs HDFS概述 HDFS产出背景及定义 背景:随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需 ...

  9. python网络爬虫数据解析之正则

    本节内容,讲解爬取网络图片,利用正则匹配图片地址 请求网页之后,响应部分内容如下图: 1 时间:2023/1/7 10:42 2 功能描述 3 1.进行指定标签的定位 4 2.标签或者标签对应的属性中 ...

  10. linux系统一键开启root登陆

    服务器只能key登陆,用这个后直接可以root方式登陆 sudo -i echo root:要设置的密码 |sudo chpasswd root sudo sed -i 's/^#\?PermitRo ...