好久没做数学导数都想不过来了= =,本题是F''(x)恒大于0,所以F'(x)递增,零点以前的F(x)都是减函数,所以以零点为判断标准就行了。
而且事实证明无法用宏定义二变量函数。
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <cmath>
#include <iostream>
#include <stdlib.h>
using namespace std;
const int N = 100;
const int INF = 1000000;
double ans(double x,double y)
{
return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*x*x-y*x;
}
double der(double x,double y)
{
return 42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x-y;
}
int main()
{
// freopen("in.txt", "r", stdin);
int T;
double r, l, mid, y;
scanf("%d", &T);
while(T --)
{
scanf("%lf", &y);
r = 100;
l = 0;
while(fabs(r - l) > 1e-10)
{
mid = (r + l) / 2.0;//注意这里是+号,还有2.0
if(der(mid, y) > 0) r = mid;
else l = mid;
}
printf("%.4lf\n", ans(mid, y));
}
return 0;
}
下面是三分法,上图吧:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <cmath>
#include <iostream>
#include <stdlib.h>
using namespace std;
const int N = 100;
const int INF = 1000000;
double ans(double x,double y)
{
return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*x*x-y*x;
}
int main()
{
// freopen("in.txt", "r", stdin);
int T;
double r, l, mid, y, midmid;
scanf("%d", &T);
while(T --)
{
scanf("%lf", &y);
r = 100;
l = 0;
while(fabs(r - l) > 1e-10)
{
mid = (r + l) / 2.0;
midmid = (mid + r) / 2.0;
if(ans(midmid, y) < ans(mid, y)) l = mid;
else r = midmid;
}
printf("%.4lf\n", ans(l, y));
}
return 0;
}