三分求极值和二分解方程

三分求极值

链接在此

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cstdio>
#include<cstring>
//#include<iomainip>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<stack>
#include<utility> 
const double eps = 1e-7;
using namespace std;
int a,b,c,x,y;
double equ(double n){
	return sqrt((n - x) * (n - x) + (a * n * n +b * n + c - y) * (a * n * n +b * n + c - y));
}
int main(){
	cin>>a>>b>>c>>x>>y;
	double l = -200,r = 200;
	double mid = (l + r) / 2;
	double midmid = (r + mid) / 2;
	while(r - l > eps){
		//一定要注意三分求极值的终止条件为精度问题 
		if(equ(mid) > equ(midmid)){
			l = mid ;
			//三分求极值中midmid在谁那一边谁为midmid 
		//也可以用原理记忆,通过附近只有一个峰值即可 
		}
		else{
			r = midmid ;
		}//这个if和else的条件不需要特判相等这一项!!! 
		//而且l和r不用再加1或是减1,默认这个和解方程一样!! 
		mid = (l + r) / 2;
		midmid = (r + mid) / 2;
	}
	printf("%.3f\n",equ(midmid));
	return 0;
}

二分解方程

链接在此处

#include<bits/stdc++.h>
using namespace std;
int main() {
	int t;
	cin>>t;

	while(t--) {
		long double mid,l=0,r=100,y;
		mid=(l+r)/2;
		cin>>y;

		while((r-l)>1e-8) {
			if(mid*mid*mid*mid*8+7*mid*mid*mid+2*mid*mid+3*mid+6-y>0) {
				r=mid;
			} else if(mid*mid*mid*mid*8+7*mid*mid*mid+2*mid*mid+3*mid+6-y<0) {
				l=mid;
			}
			else break;
			mid=(l+r)/2;
		}
		if(6-y<=0 && 100*100*100*100*8+7*100*100*100+2*100*100+3*100+6-y>=0)
			cout<<fixed<<setprecision(4)<<mid<<endl;
		else cout<<"No solution!"<<endl;
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值