重庆师范大学第一届ACM选拔赛(公开赛)I:炎炎消防队
炎炎消防队
https://ac.nowcoder.com/acm/contest/6840/I
I:炎炎消防队
题目描述:
夏天的重庆格外地炎热,很容易起火。消防士们都全副武装,一旦发生险情就立马赶往救火。森罗是消防队中的一员,他在灭火的过程中突发奇想,如果能用退火的原理求解函数求最小值,那不就可以很容易计算了吗?
翌日,森罗来到即将高考的弟弟家辅导功课,其中一道题目是这样的函数
给定任意一个实数y,让你求出函数的最小值。森罗回想起昨天的突发奇想,很快就给出了这个题目的解。那么,你知道他是怎么解决的吗?
一看出题人就是老二次元了(所以这题和消防队有啥关系吗?),退火算法是一个非常优秀、非常……(省略1000个字),但是!!!我不会,听都没听说过。。。(真·菜鸡)
所以————暴力三分,如果1/3处的值比2/3处的值大那left移动到1/3的位置,min所在的区间必然在剩下的(1/3,1)内,否则right移动到2/3处,min所在区间必然在剩下的(0,2/3)内,一路细分下去,直到答案够精确。
没写过三分的我,等分算错了,改半天才好好尴尬啊。
AC代码如下:
#include <bits/stdc++.h> using namespace std; long long T; double ri,le,ml,mr,y; double f(double x){ return 7*pow(x,7)+6*pow(x,6)+2*pow(x,3)+8*x*x-y*x; } int main(){ cin>>T; while(T--){ cin>>y; ri=100;le=0; while(ri-le>=0.00001){ ml=(ri-le)/3+le; mr=(ri-le)/3*2+le; if(f(ml)<f(mr)) ri=mr; else le=ml; } printf("%.4lf\n",f(ml)); } return 0; }