Strange fuction |
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
Total Submission(s): 754 Accepted Submission(s): 612 |
Problem Description
Now, here is a fuction:
F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100) Can you find the minimum value when x is between 0 and 100. |
Input
The first line of the input contains an integer T(1<=T<=100) which means the number of test cases. Then T lines follow, each line has only one real numbers Y.(0 < Y <1e10)
|
Output
Just the minimum value (accurate up to 4 decimal places),when x is between 0 and 100. |
Sample Input
2
100
200
|
Sample Output
-74.4291
-178.8534
|
Author
Redow
|
Recommend
lcy
|
这道题的数据很小,可以直接暴力过。
这道题的本意是二分查找。找导函数的零点。
这是暴力的代码:
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
double y;
cin >> y;
double x;
double min=0.0;
for ( x = 0; x <10 ; x+=0.00001)//我先将Y=0时和Y=100时的情况枚举了一遍,发现最小值在0,10里面。
{
double temp = 6 * x*x*x*x*x*x*x + 8 * x*x*x*x*x*x + 7 * x*x*x + 5 * x*x - y* x;
if (temp < min)min = temp;
}
printf("%.4lf\n", min);
}
return 0;
}
三分的代码:
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
double y;
const double eps = 1e-6;
double c(double x)
{
return 6 * x*x*x*x*x*x*x + 8 * x*x*x*x*x*x + 7 * x*x*x + 5 * x*x - y* x;
}
int main()
{
int t;
cin >> t;
while (t--)
{
cin >> y;
double first = 0;
double last =100;
double mid1;
double mid2;
while (first+eps<last)
{
mid1 = first + (last-first) / 3;
mid2 = last - (last-first) / 3;
if (c(mid1) > c(mid2))first = mid1;
else last = mid2;
}
printf("%.4lf\n", c(mid2));
}
return 0;
}