三分 , 哈希, 模拟退火

news/2025/4/1 1:12:52/文章来源:https://www.cnblogs.com/HEGVDV/p/18799945

三分,哈希, 模拟退火

I .三分

三分,顾名思义, 将一个区间分成三段(需要平均分), 以类似二分的处理方式判断答案在那个区间。

接着继续枚举, 直到确定结果。

三分一样需要单调性, 但单调性与二分有所不同。

二分需要满足数据严格“ 递增 ”或“ 递减 ”。而三分只需要满足数据是一个单峰或单谷函数(如图就是一个单谷函数)binary1

接下来, 我

义图中左黄点为L(和二分相当的左端点), 右黄点为 R(右端点), 右蓝点为Rmid, 左蓝点为Lmid。

则绿点为所求答案。

那么, Rmid 和 Lmid 怎么求呢。

非常简单, (2 * l + r) / 3 = Lmid , (2 * r + l ) / 3 = Rmid。这里不证明

接着是模板

#include<bits/stdc++.h>
using namespace std;
int T;
int n;
int a[10005], b[10005], c[10005];
double s(double x)
{double ans = -1e9;for(int i = 1; i <= n; i++)ans = max(ans, a[i]*1.0*x*x + b[i]*1.0*x + c[i]*1.0);return ans;
}
int main()
{cin >> T;while(T--){cin >> n;for(int i = 1; i <= n; i++)cin >> a[i] >> b[i] >> c[i];double l = 0, r = 1000;while(r - l > 0.000000001){double mid1 = (l*2+r)/3;double mid2 = (l+r*2)/3;if(s(mid1) < s(mid2))r = mid2;elsel = mid1;}printf("%.4f\n", s(l));}
}

上述代码就是关于求一个单峰(单谷)的函数的解。

由此可见,三分可以解决数据(可能性)上升(下降)再下降(上升)的问题。

(其实就是二分变种)

II.哈希

哈希是指将字符串的状态表示为数字的算法,以用来状态压缩

普遍的, 我们将这个字符每一位都当作一个N进制数,并mod一个数(因为数可能很大)

int n; //进制
int p; //模数
string a;//待处理字符串
int ans;// 处理后的数字
for(int i = 0; i < p,size(); i++)ans = (ans + (p[i]-'a') * pow(n, i)) % p;//p[i] - 'a'指将字符处理成数字

(自然,n, p 甚至是每个字符表示的数字都是可以改变的)

这样,每个字符串(也就是状态)的比较就变成了O(1) 的复杂度。

但是,我们会发现一个问题 a%p 可能等于 b%p (b = a * x )。这时,a != b,但状态结果一样。这就是哈希冲突

为了尽量避免哈希冲突,我们可以将模数调大,并将模数改为质数

III.模拟退火(SA)

一种很玄的算法,我不希望在考场上遇见。

模拟退火,指模拟物理上退火的过程

首先, 要有一个温度变量T,当T变小时,答案跳动的幅度就会变得更小。

我们会用随机函数来随机出下一步的答案(即答案跳动)

如果答案更优,直接接受。如果答案更劣,则有
$$
P(\Delta E) = \begin{cases}
{1 , \hspace{1.1cm} S'\ \ is \ \ better \ \ than \ \ S} \
{e^{\frac{-\Delta E}{t}}},\hspace{1.1cm}ohters\
\end {cases}
$$
e 什么意思不用管,只知道代码就行了(如下)

exp(-d / t) *RAND_MAX > rand()//答案更劣时

整体伪代码如下

int t = 2000//温度(答案变动幅度)
int ans; //答案(暂时)
while(t > 1e-15)//1e-15可自定
{x = ansx + (rand() * 2 - RAND_MAX) * t;//括号内按题意自定d = pd(x)//判断答案更优或更劣if(d < 0)//更优ansx = x;//更新答案else if(exp(-d / t) * RAND_MAX > rand())//更劣有概率接受ansx = x;t *= 0.999//自定
}

由于有随机数的存在,所以答案不一定准确,需要调整参数,慢慢尝试。

(en, 有概率AC)

究极玄学算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/907875.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享一款替代 GitLab 的开源软件 gogs ,适合中小企业,非常优秀!

这篇文章,分享一款替代 GitLab 的开源软件 gogs ,Github 上有 4 万多颗 star ,笔者认为它非常优秀 ,适合中小企业。1 Gogs 简介 Gogs 是一款极易搭建的自助 Git 服务,它使用 Go 语言开发,只要 Go 语言支持的平台它都支持,包括 Linux 、Mac OS X、Windows 以及 ARM 平台。…

【闲话 No.3】 并查集相关

并查集的复杂度证明及可持久化。命に嫌われている。 小唐话 感觉有的时候已经无法与人正常交流,净做唐事、说些唐话了。或许是我无法准确猜到别人喜欢什么吧。 不过还是自己心底一点 joker 之心/私心作祟吧。 感觉我有时做的唐事真的挺对不起大家的。 可我又怎么战胜心底的那…

3.29 学习记录

实现了科技页面的树状图查询和分页查询

Django - admin djangoql

效果: 1. pip installpip install djangoql 2. settings.pyINSTALLED_APPS = [djangoql, ] 3. admin.pyfrom django.contrib import admin from djangoql.admin import DjangoQLSearchMixinfrom .models import *@admin.register(User) class UserAdmin(DjangoQLSearchMixi…

[rCore学习笔记 025 extend] 带优先级的抢占式调度

引言 因为rcore并非设计为一个rtos,而是在我们需要的时候我们需要在设计的时候考虑到线程切换的时候的延时问题. 回顾上一部分的使用环形队列进行调度的方式,我们会发现我们寻找下一个Ready的任务的时间是不均匀的.并且我们的任务是没有优先级的,可以认为是平权的,因此,为了:快…

第五周第三章3.6-3.8,思考与练习3.19-3.21

3.6 import time a = "strating" print("{:^}".format(a),end=) for i in range(11): s = . * i print("{:<}".format(s),end=) time.sleep(1) print("Done!") 思考与练习3.19 import time current_time = time.time() time_tuple …

【Java - demo】Redis开发入门

Redis 是一个高性能的键值存储数据库,常用于缓存、消息队列等场景。 本文将以简单易懂的方式介绍 Redis 的基本概念和使用方法,并附上 Java 示例代码,帮助你快速上手。 一、Redis 是什么? Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统。它支持多…

【流量预警】装了UU远程/GameViewer的小心了

前言 月末了,没流量了,不过我今天怎么跑了4个G的流量? 我倒要看看是谁干的好事。热点跑的?但是我一整天都挂着手机连电脑没动啊,最多也就偶尔用了一下。 别让我找到是谁偷跑我流量跑这么多 好啊好,UU远程,得,你清高,你偷偷上传我电脑数据是吧。虽说没抓到现行也只能怀…

注释、关键字、标识符

1、Java的注释有几种? 单行注释 使用双斜杠//,仅注释该行//后的内容。 多行注释(块注释) 使用/*开始,*/结束,中间所有内容均为注释,可跨越多行。 文档注释 使用/**开始,*/结束,通常用于生成API文档(通过Javadoc工具)。支持特定标签(如@param、@return等)。 关键区…

Mysql全量安装配置教程(超详细window版本无需配置环境变量)尊享篇

官网下载注册 注册 官网地址:https://www.oracle.com/mysql/technologies/mysql-enterprise-edition-downloads.html#windows 下载需要注册登录 注册可以用临时邮箱地址:https://www.suiyongsuiqi.com/zh/mail/ 如果显示400badrequest 打开无痕浏览窗口重新访问即可 解压所需…