在实数域上的三分,设置精度值eps
三分的中间值取1/3区间长度就行
#include<bits/stdc++.h>
using namespace std;
#define _f(i,a,b) for(register int i=a;i<=b;++i)
#define f_(i,a,b) for(register int i=a;i>=b;--i)
#define chu printf
#define ll long long
#define rint register int
#define ull unsigned long long
inline ll re()
{
ll x=0,h=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')h=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*h;
}
const int N=510;
int n;
double l,r,mid1,mid2;
double xs[15];
#define eps 1e-6
inline double calc(double x)
{
double ans=xs[n+1];double my=x;
f_(i,n,1)
{
ans=ans+my*xs[i];
my=my*x;
}
return ans;
}
int main()
{
n=re();
scanf("%lf",&l);
scanf("%lf",&r);
_f(i,1,n+1)scanf("%lf",&xs[i]);
while((r-l)>eps)
{
mid1=l+(r-l)/3,mid2=r-(r-l)/3;
if(calc(mid1)<calc(mid2))l=mid1;
else r=mid2;
}
chu("%lf",l);
return 0;
}
如果是整数域三分,区间长度取r-l>2,留出2~3个值来就跳出,外面取最优,否则会死循环
int l = 1, r = mx, mid1, mid2;
while ((r - l) > 2) {
mid1=l+(r-l)*1.0/3;mid2=r-(r-l)*1.0/3;
if (check(mid1) >= check(mid2)) l = mid1;
else r = mid2;
}
cout << min(min(check(l), check(l+1)), check(l+2)) << endl;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】