[2021.8集训Day10/JZOJ.3410]【GDOI2014模拟】Tree
时间:2021-08-20
本文章向大家介绍[2021.8集训Day10/JZOJ.3410]【GDOI2014模拟】Tree,主要包括[2021.8集训Day10/JZOJ.3410]【GDOI2014模拟】Tree使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目
思路
我们枚举一个参考平均数(注意不是真正的平均数),把每条边按边权与参考平均数的差的绝对值从小到大排序,跑一遍Kruskal,即可求出对应的标准差:
double now_average;//参考平均数
struct EDGE {
int u , v , c;
}ed[M];
bool cmp(EDGE a , EDGE b) {
return fabs((double)a.c - now_average) < fabs((double)b.c - now_average);
}
bool choosed[M];
double GetDeviation() {
UF::init();
std::sort(ed + 1 , ed + m + 1 , cmp);
std::memset(choosed , 0 , sizeof(choosed));
double average;
for(int i = 1 ; i <= m ; i++) {
int u = ed[i].u , v = ed[i].v;
if(UF::findroot(u) == UF::findroot(v))
continue;
UF::uni(ed[i].u , ed[i].v);
choosed[i] = true;
average += ed[i].c;
}
double deviation = 0;
average /= (double)(n - 1);//真正的平均数
for(int i = 1 ; i <= m ; i++)
if(choosed[i])
deviation += fabs(average - (double)ed[i].c) * fabs(average - (double)ed[i].c);
return sqrt(deviation / (double)(n - 1));
}
不难想到, 若\(x=\text{参考平均数}\),\(f(x)=参考平均数对应的标准差\),\(f(x)\)应该是一条比较丝滑的曲线,因此,我用了模拟退火.其实直接一个一个枚举也行,不过模拟退火跑得巨快300ms内就可以出结果.
代码
这不是GMOJ的AC代码
同样的数据,本地A,洛谷云IDE A , GMOJ WA(雾)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <cstring>
unsigned seed;
int read() {
int re = 0;
char c = getchar();
bool negt = false;
while(c < '0' || c > '9')
negt |= (c == '-') , c = getchar();
while(c >= '0' && c <= '9')
re = (re << 1) + (re << 3) + c - '0' , c = getchar();
seed *= re;
return negt ? -re : re;
}
const int N = 110 , M = 2010;
struct EDGE {
int u , v , c;
}ed[M];
const double delta_t = 0.993;
const double originT = 100;//初始温度没必要太大,因为c的范围小
int n , m;
double ans_average , ans_deviation = 1e10;
namespace UF {
int fa[N];
void init() {
for(int i = 1 ; i <= n ; i++)
fa[i] = i;
}
int findroot(int x) {
return fa[x] == x ? x : (fa[x] = findroot(fa[x]));
}
inline void uni(int u , int v) {
if(findroot(u) != findroot(v))
fa[findroot(u)] = fa[v];
}
}
double now_average = 50;
bool cmp(EDGE a , EDGE b) {
return fabs((double)a.c - now_average) < fabs((double)b.c - now_average);
}
bool choosed[M];
int minc , maxc;
double GetDeviation() {
UF::init();
std::sort(ed + 1 , ed + m + 1 , cmp);
std::memset(choosed , 0 , sizeof(choosed));
double average;
for(int i = 1 ; i <= m ; i++) {
int u = ed[i].u , v = ed[i].v;
if(UF::findroot(u) == UF::findroot(v))
continue;
UF::uni(ed[i].u , ed[i].v);
choosed[i] = true;
average += ed[i].c;
}
double deviation = 0;
average /= (double)(n - 1);
for(int i = 1 ; i <= m ; i++)
if(choosed[i])
deviation += fabs(average - (double)ed[i].c) * fabs(average - (double)ed[i].c);
return sqrt(deviation / (double)(n - 1));
}
void simulate_anneal() {
double average = ans_average;
double t = originT;
while(t > 1e-5) {//这个也没必要太小,否则答案没影响
now_average = average + (rand() * 2 - RAND_MAX) * t;
if(now_average < 0 || now_average > 100) {//优化下,温度的范围变小后,模拟退火可以跑得巨快.
t *= delta_t;
continue;
}
double now_deviation = GetDeviation();
double DE = now_deviation - ans_deviation;
if(DE < 0) {
ans_average = average = now_average;
ans_deviation = now_deviation;
}
else if(exp(-DE / t) * RAND_MAX > rand()) {
average = now_average;
}
t *= delta_t;
}
}
int main() {
n = read() , m = read();
for(int i = 1 ; i <= m ; i++) {
ed[i].u = read() , ed[i].v = read() , ed[i].c = read();
}
std::srand(seed);
for(int i = 1 ; i <= (m <= 20 ? 10 : 3) ; i++)
simulate_anneal();
std::printf("%.4f" , ans_deviation);
return 0;
}
原文地址:https://www.cnblogs.com/dream1024/p/15168214.html
- 配置远程访问Jupyter+腾讯云超划算活动上车
- HDU 4256 The Famous Clock
- ZOJ 1403&&HDU 1015 Safecracker【暴力】
- Torch7搭建卷积神经网络详细教程
- 爬虫入门到精通-HTTP协议的讲解
- 批量替换文件名和文本文件内容mac
- 抓取手机app的数据(摩拜单车)
- Hadoop离线数据分析平台实战——520项目总结Hadoop离线数据分析平台实战——520项目总结
- 爬虫入门到精通-mongodb的基本使用
- 拒绝撕逼,用数据来告诉你选择器到底哪家强
- 爬虫入门到精通-headers的详细讲解(If-modified-since)
- Linux配置网卡
- 【爬虫军火库】生成指定日期间的日期列表
- 手把手教你安装大数据开发测试环境手把手教你安装大数据开发测试环境
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 经典写配置漏洞与几种变形
- GitLab安装及使用
- 持续集成-Jenkins安装部署
- 谈一谈Linux与suid提权
- PHP动态特性的捕捉与逃逸
- ES6 随性学习之 新增数据类型 Symbol
- 最简单入门深度学习
- 持续集成-Jenkins常用插件安装
- 小白学PyTorch | 15 TF2实现一个简单的服装分类任务
- 小白学PyTorch | 16 TF2读取图片的方法
- 小白学PyTorch | 17 TFrec文件的创建与读取
- 小白学PyTorch | 18 TF2构建自定义模型
- 扩展之Tensorflow2.0 | 19 TF2模型的存储与载入
- 扩展之Tensorflow2.0 | 20 TF2的eager模式与求导
- Django JSONField SQL注入漏洞(CVE-2019-14234)分析与影响