杭电2899--Strange fuction(二、三分)

Strange fuction

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4603    Accepted Submission(s): 3308


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   |   We have carefully selected several similar problems for you:   2289  2298  3400  2446  1399 
RE: 求最值问题。
//三分法:
 1 #include <cstdio>
 2 #include <iostream>
 3 using namespace std;
 4 double f(double x, double y)
 5 {
 6     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;
 7 }
 8 int main()
 9 {
10     int t; double m;
11     scanf("%d", &t);
12     while(t--)
13     {
14         scanf("%lf", &m);
15         double l_min, r_max, min = 0.0, max = 100.0;
16     //    printf("%.4lf %.4lf\n", min, max);
17         while(max - min > 1e-8)
18         {
19             l_min = (2 * min + max) / 3.0;
20             r_max = (min + 2 * max) / 3.0;
21             if(f(l_min, m)>f(r_max, m)) min = l_min;
22             else max = r_max; 
23         }
24     //    printf("%.4lf %.4lf\n", min, max);
25         printf("%.4lf\n",f((min + max) / 2.0, m));
26     }
27     return 0;
28 } 

//闲来无事, 敲敲手生的二分(大同小异, 一个比较值, 一个比较导数);

 1 #include <cstdio>
 2 #include <iostream>
 3 using namespace std;
 4 double f(double x, double y)
 5 {
 6     return 42*x*x*x*x*x*x+48*x*x*x*x*x+21*x*x+10*x-y;
 7 }
 8 double F(double x, double y)
 9 {
10     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; 
11 }
12 int main()
13 {
14     int t;
15     scanf("%d", &t);
16     while(t--)
17     {
18         double m, min = 0.0, max = 100.0, mid;
19         scanf("%lf", &m);
20         while(max - min > 1e-8)
21         {
22             mid = (max + min) / 2.0;
23             if(f(mid, m) <= 0) min = mid;
24             else max = mid;
25         }
26         printf("%.4lf\n", F((min + max) / 2.0 , m));
27     }
28     return 0;
29 } 

 

转载于:https://www.cnblogs.com/soTired/p/4701939.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值