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& ...
随机推荐
- [论文阅读] 颜色迁移-Linear Monge-Kantorovitch(MKL)
[论文阅读] 颜色迁移-Linear Monge-Kantorovitch(MKL) 文章: The Linear Monge-Kantorovitch Linear Colour Mapping f ...
- 【知识体系】Kafka文档汇总、组成及架构,配置,常见名词解释,命令行及api操作,官方文档内容,各部分深入,zookeeper和security,监控和运维
〇.相关资料 1.快速搭建文档: 2.详细讲义 3.在线官方文档:http://kafka.apache.org/documentation/ 4.Kafka知识个人总结 5.KafkaPPT汇报 链 ...
- 【Java】二分查找标准代码
太菜了..写不出正确的... 干脆放一个标准代码,之后参考 boolean BinarySearch(int[] m){ int l=0,r=m.length-1;//减1相当于数组两头(lr都能指到 ...
- Day38:Lambda表达式
Lambda表达式 1.1 概述 Lambda是JDK8开始后的一种新语法形式. 作用:简化函数式匿名内部类的代码写法. 简化格式: /*部类被重写方法的参数)->{ 被重写方法的方法体代码 } ...
- 使用命令行运行用例时提示python.exe: Error while finding module specification for 'testcase_1.Test'.....
文件路径 输入命令 D:\demo>python -m unittest unittest_1/testcase_1.Test结果提示 ModuleNotFoundError: No modul ...
- 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 ...
- C#代码扫描工具Sonarqube + Win10+SqlServer2017
在之前的公司, 看到有用过代码扫描工具, 扫描C#代码, 最近公司也有考虑做这个,于是我便独自研究了一下,这里给大家做个分享 网上找了很多资料, 主要有以下问题: 1. Sonarqube用的是 旧版 ...
- Hadoop详解(04)-Hdfs
Hadoop详解(04)-Hdfs HDFS概述 HDFS产出背景及定义 背景:随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需 ...
- python网络爬虫数据解析之正则
本节内容,讲解爬取网络图片,利用正则匹配图片地址 请求网页之后,响应部分内容如下图: 1 时间:2023/1/7 10:42 2 功能描述 3 1.进行指定标签的定位 4 2.标签或者标签对应的属性中 ...
- linux系统一键开启root登陆
服务器只能key登陆,用这个后直接可以root方式登陆 sudo -i echo root:要设置的密码 |sudo chpasswd root sudo sed -i 's/^#\?PermitRo ...