列表

详情


NC211252. I、炎炎消防队

描述

夏天的重庆格外地炎热,很容易起火。消防士们都全副武装,一旦发生险情就立马赶往救火。森罗是消防队中的一员,他在灭火的过程中突发奇想,如果能用退火的原理求解函数求最小值,那不就可以很容易计算了吗?
翌日,森罗来到即将高考的弟弟家辅导功课,其中一道题目是这样的函数

给定任意一个实数y,让你求出函数的最小值。森罗回想起昨天的突发奇想,很快就给出了这个题目的解。那么,你知道他是怎么解决的吗?

输入描述

多组输入
第一行输入测试的样例数量T
以后每一行输入实数y的值。(0<y<1e10)

输出描述

每一行输出函数的最小值(精确到小数点后四位)。

示例1

输入:

2
10
20

输出:

-2.6256
-8.2788

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 52ms, 内存消耗: 384K, 提交时间: 2020-08-23 14:59:03

#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
int t;
double y;
double cal (double x) {
	return 7*x*x*x*x*x*x*x+6*x*x*x*x*x*x+2*x*x*x+8*x*x-y*x;
}
int main () {
	scanf("%d",&t);
	while (t--) {
		scanf("%lf",&y);
		double ans=cal(0);
		for (double i=0;i<=100;i+=0.0001) 
			ans=min(ans,cal(i));
		printf("%.4f\n",ans);
	}
}

C++(clang++11) 解法, 执行用时: 220ms, 内存消耗: 496K, 提交时间: 2020-10-22 13:30:32

#include<iostream>
#include<cstdio>
using namespace std;
double y,a;
double f(double x)
{
	return 7*x*x*x*x*x*x*x+6*x*x*x*x*x*x+2*x*x*x+8*x*x-y*x;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		cin>>y;
        a=0.00;
		for(double i=0;i<=100;i+=0.0001)
			a=min(a,f(i));
		printf("%.4lf\n",a);
	}
	return 0;
}

matlab(Octave 4.0.0) 解法, 执行用时: 169ms, 内存消耗: 9932K, 提交时间: 2020-08-23 16:08:15

t=input('');
while(t)
    t=t-1;
y=input('');
x1=0;x2=100;
yx=@(x)(7*x^7+6*x^6+2*x^3+8*x^2-y*x);
[xn0,fval]=fminbnd(yx,x1,x2);
disp(fval);
end

上一题