三分法+数学最大值思维

三分题
题面

三分法+数学最大值思维_第1张图片
题意
由n个函数中在同一横坐标下最大值构成的曲线的最小值
分析
简单的来说:就是取n个函数相比较得到的最大值的那部分区段,我们把它记作s,然后求s在1-1000的最小值。
这道题突然给一个当初刚刚学了三分的我一看,简直是一脸懵逼状态。其实现在我了解三分的本质的后才发现这道题目其实就是模板题。=o=
那我们先谈谈三分的本质是什么:就是给一个具有凹凸性的函数,然后求这个函数的极值。
我们看看这一个题目,与三分模板只差了一个桥梁(怎么构造这个凹凸性)
其实大家一开始的思路可能想把这个凹凸性函数的每一个点都枚举出来,可是因为这是小数,所以暴力枚举是不可能的。所以,我们就换一个思路(我们可以先从三分入手找到可能是答案的点,然后判别一下这个点在不在这个凹凸性函数上,最终就可以得到答案了)以下就是
o~o这道题目比较坑,eps为1e-10才ac,我试了1e-6居然wa了 ovo!
AC代码

#include 
#include
#include
#include
#include
#include
#define eps 1e-10
using namespace std;
int n,a[10005],b[10005],c[10005];
double f(double r){
 double maxx=a[1]*pow(r,2)+b[1]*r+c[1];
for(int i=2;i<=n;i++)
    maxx=max(maxx,a[i]*pow(r,2)+b[i]*r+c[i]);
return maxx;
}
int main()
{
    int t,i;
    scanf("%d",&t);
    while(t--){
		double left=0,right=1000,mid,midmid;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d%d%d",&a[i],&b[i],&c[i]);
	while(left+eps<=right){
		mid=(left+right)/2;
		midmid=(mid+right)/2;
		if(f(mid)<f(midmid))
			right=midmid;
		else
			left=mid;
	}
	printf("%.4f\n",f(left));
    }
    return 0;
}

你可能感兴趣的:(2019)