JZOJ 3528. 【NOIP2013模拟11.7A组】图书馆(library)
题目
解析
看到这题,没想到 \(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)的更多相关文章
- JZOJ 3526. 【NOIP2013模拟11.7A组】不等式(solve)
3526. [NOIP2013模拟11.7A组]不等式(solve) (File IO): input:solve.in output:solve.out Time Limits: 1000 ms M ...
- JZOJ 3509. 【NOIP2013模拟11.5B组】倒霉的小C
3509. [NOIP2013模拟11.5B组]倒霉的小C(beats) (File IO): input:beats.in output:beats.out Time Limits: 1000 ms ...
- JZOJ 3508. 【NOIP2013模拟11.5B组】好元素
3508. [NOIP2013模拟11.5B组]好元素(good) (File IO): input:good.in output:good.out Time Limits: 2000 ms Mem ...
- JZOJ 3518. 【NOIP2013模拟11.6A组】进化序列(evolve)
3518. [NOIP2013模拟11.6A组]进化序列(evolve) (File IO): input:evolve.in output:evolve.out Time Limits: 1000 ...
- JZOJ 3505. 【NOIP2013模拟11.4A组】积木(brick)
3505. [NOIP2013模拟11.4A组]积木(brick) (File IO): input:brick.in output:brick.out Time Limits: 1000 ms Me ...
- [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)
Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...
- JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨
5236. [NOIP2017模拟8.7A组]利普希茨 (File IO): input:lipschitz.in output:lipschitz.out Time Limits: 1000 ms ...
- JZOJ 5235. 【NOIP2017模拟8.7A组】好的排列
5235. [NOIP2017模拟8.7A组]好的排列 (File IO): input:permutation.in output:permutation.out Time Limits: 1000 ...
- JZOJ【NOIP2013模拟联考14】隐藏指令
JZOJ[NOIP2013模拟联考14]隐藏指令 题目 Description 在d维欧几里得空间中,指令是一个长度为2N的串.串的每一个元素为d个正交基的方向及反方向之一.例如,d = 1时(数轴) ...
- [jzoj 5343] [NOIP2017模拟9.3A组] 健美猫 解题报告 (差分)
题目链接: http://172.16.0.132/senior/#main/show/5343 题目: 题解: 记旋转i次之后的答案为$ans_i$,分别考虑每个元素对ans数组的贡献 若$s_i& ...
随机推荐
- Dojo dijit/Tree的使用以及样式设置
如果什么都不设置,默认使用dojo自带的Tree,样式模板使用claro的,效果是这样的. 1.无论是不是叶子节点,前面总要带个+号,必须要点击下才消失. 2.点击树或者某个节点是,回出现蓝色边框. ...
- 【实时数仓】Day05-ClickHouse:入门、安装、数据类型、表引擎、SQL操作、副本、分片集群
一.ClickHouse入门 1.介绍 是一个开源的列式存储数据库(DBMS) 使用C++编写 用于在线分析查询(OLAP) 能够使用SQL查询实时生成分析数据报告 2.特点 (1)列式存储 比较: ...
- 修改数据时,一直提示"具有 XXX 的 字典管理 已存在(即数据已存在)
原代码: class DictConfig(models.Model): """ 字典表 """ id = models.AutoField ...
- wsl2 kali修改语言
直接执行sudo dpkg-reconfigure locales 会提示 dpkg-query: package 'locales' is not installed and no informat ...
- [IOI2016] shortcut
有显然的 \(O(n^3)\) 做法,可以获得 \(38pts\).(退火在洛谷上能跑 \(75pts\)) 答案具有单调性,考虑二分一个 \(M\) 并判断.列出 \(i\) 到 \(j\) 的距离 ...
- R语言|ggplot2| 绘制KEGG气泡图
在 RStudio 中使用 BiocManager 安装包 install.packages("BiocManager") install.packages("ggplo ...
- JavaBean为何物?
JavaBean为何物? 摘要:初学SSM框架之后,我对JavaBean这个东西开始有了简单的接触,在很久以前听见JavaBean这个词一直以为是一个非常高大上的东西,但是在仔细研究之后发现其本质 ...
- 【力扣】剑指 Offer II 092. 翻转字符
题目 解题思路 一个很暴力的想法,在满足单调递增的前提下,使每一位分别取 1 或 0,去看看哪个结果小. 递归函数定义int dp(StringBuilder sb, int ind, int pre ...
- 洛谷P1259 黑白棋子的移动 题解
本蒟蒻这题用的打表做法,其实也可以理解为是一种递推. 先来观察一下样例: 当n为7时,输出共有14行,易得输出行数为2n. ooooooo*******-- oooooo--******o* oooo ...
- 解决angular11+zorro使用table组件排序失效以及分页组件失效问题,附完整DEMO代码
关于这个排序失效问题的核心点,跟这个有关系:[nzFrontPagination]="false" 关于分页组件失效的问题,是你获取数据以后,需要给页码,页数,总条数都要重新赋值, ...