关于这一题的模拟退火做法
查看原帖
关于这一题的模拟退火做法
895690
gghack_Nythix楼主2024/1/20 17:38

rt,这可行吗(在只查询最大和最小的两个实数根情况下)?我自己试了一下跑不出答案(应该是我写挂了)。

#include<bits/stdc++.h>
using namespace std;
#define eps 1e-4
double a, b, c, d;
int cnt;
double check(double x){
	return a * x * x * x + b * x * x + c * x + d;
}
bool checke(double x){
	return a * x * x * x + b * x * x + c * x + d == 0;
}
double sol;
void SA(){
	double T = 1000,dT = 0.997;
	while(T > 1e-10){
		double newsoll = (RAND_MAX - rand() * 2) * T;
		double newsol = check(newsoll);
		if(newsol - sol > 0 && (checke(newsoll)))sol = newsoll;
		else if(exp(-(newsol - sol) / T) < double(rand()* 1.0 / RAND_MAX) && checke(newsoll))sol = newsoll;
		T *= dT;
	}
}

signed main()
{
	srand(54564646);
	cin >> a >> b >> c >> d;
	SA();
	cout << fixed << setprecision(2) << sol << " ";
	return 0;
}
2024/1/20 17:38
加载中...