zoukankan      html  css  js  c++  java
  • 【复习笔记】三分算法

    考试考到了三分,但是我忘了(qwq)

    似乎没啥好说的,三分用于求单峰函数(f(x))的最值。

    存个板子,分别是整数和浮点数的。

    如果忘了的话可以看一下 这个,写得还比较清楚。

    在实际实现过程中,为了避免卡精度/死循环之类的惨案发生,可以适当将(EPS)设得大一点(指整数边界的差值,浮点数要看题目要求喏),在用三分得到了一个比较精确的区间之后,再枚举,并更新答案。或者也可以设定一个循环次数。

    二分也是这样的(我记得之前的一些二分题就是这么干的,诶,记不太清楚了

    二分答案的话,如果很明确区间左闭右闭/左闭右开/左开右开,或者哪个边界是合法但不优,哪个边界是答案足够小/大但不合法,就心里比较有底(感觉二分答案思路清晰一点)


    ►Code View

    void dac_for_int()
    {
    	int l/*=...*/,r/*=...*/,lans,rans;
    	while(l+2<r)
    	{
    		int lmid=l+(r-l)/3,rmid=r-(r-l)/3;
    		lans=f(lmid),rans=f(rmid);//函数f(x)
    		//---min
    		if(lans>rans) l=lmid;
    		else r=rmid;
    		//---
    		//---max
    		if(lans<rans) l=lmid;
    		else r=rmid;
    		//---
    	}
    	int ans=INF;
        for(int i=l;i<=r;i++)
            ans=min(ans,f(i));//这个具体看答案求啥
    }
    #define EPS 1e-9
    void dac_for_double()
    {
    	double l/*=...*/,r/*=...*/,lans,rans;
    	while(l+EPS<r)
    	{
    		double lmid=l+(r-l)/3.0,rmid=r-(r-l)/3.0;
    		lans=f(lmid),rans=f(rmid);
    		//---min
    		if(lans>rans) l=lmid;
    		else r=rmid;
    		//---
    		//---max
    		if(lans<rans) l=lmid;
    		else r=rmid;
    		//---
    	}
    	printf("%.9f
    ",l);//这个看着办吧(看答案求啥)
    }
    
  • 相关阅读:
    把函数作为参数,调用的时候,先判断这个参数是不是存在,然后调用函数的时候加上()
    @keyframes 和animation配合使用
    让sublime text3支持Vue语法高亮显示
    vue.js中的vue-cli中各个文件简单介绍
    函数节流
    Ajax原理
    Ajax同步
    判断数据类型的方法
    闭包的用途
    vue模板编译
  • 原文地址:https://www.cnblogs.com/lyttt/p/14081725.html
Copyright © 2011-2022 走看看