日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

【模板】三分法

發布時間:2024/6/21 综合教程 28 生活家
生活随笔 收集整理的這篇文章主要介紹了 【模板】三分法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

如題,給出一個N次函數,保證在范圍[l,r]內存在一點x,使得[l,x]上單調增,[x,r]上單調減。試求出x的值。

輸入輸出格式

輸入格式:

第一行一次包含一個正整數N和兩個實數l、r,含義如題目描述所示。

第二行包含N+1個實數,從高到低依次表示該N次函數各項的系數。

輸出格式:

輸出為一行,包含一個實數,即為x的值。四舍五入保留5位小數。

說明

時空限制:50ms,128M

數據規模:

對于100%的數據:7<=N<=13

思路:

這是一道三分的模板題,在這里我講一下三分

三分是什么??:

三分是一種優化的暴力,從他的名字就可以知道,這是一種很類似于二分的方法,通過一系列操作時復雜度由O(n)降到O(logn)

三分能干什么?

求單峰多次函數最值位置(近似值)

如何實現三分?(這個是重點)

我們先看一幅圖(picture by luogu)

現在我們的已知條件有峰所在的區間和函數表達式,這就很好辦

首先我們取區間中點

然后取離中點很近的兩個點(距離必須小于等于要求精度),并求出它們的函數值

這時候通過判斷函數值的大小就可以知道此處是遞增還是遞減

如果遞增,那點就在左區間,峰在其右,區間左端點就變成區間中點

反之亦然

一直縮小區間大小

到滿足精度時,答案就呼之欲出

一點小優化:

高中的同學應該都知道有個東西叫秦九韶算法

它可以將a0+a1*x^1+a2*x^2……an^xn這個高復雜度的東西

優化為an(x+an-1(x……a1(x+a0)))這個線性的式子

復雜度下降了一個log

很好使

見代碼:

#include<iostream>
#include<cstdio>
#include<cmath>
#define rii register int i
using namespace std;
int n;
double xs[15],l,r,final,mid;
double eps=0.000001;
double dxs(double z)
{
	double ans=0;
	for(rii=n;i>=0;i--)
	{
		ans=ans*z+xs[i];
	}
	return ans; 
}
int main()
{
	cin>>n>>l>>r;
	for(rii=n;i>=0;i--)
	{
		cin>>xs[i];
	}
	eps=0.000001;
	while(1)
	{
		if(fabs(r-l)<eps)
		{
			final=r;
			break;
		}
		mid=(l+r)/2;
		if(dxs(mid+eps)>dxs(mid-eps))
		{
			l=mid;
		}
		else
		{
			r=mid;
		}
	}
	printf("%.5lf",final);
}

  

總結

以上是生活随笔為你收集整理的【模板】三分法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。