HDU 2899 Strange fuction

来源:互联网 发布:单片机开发 前景 编辑:程序博客网 时间:2024/05/22 17:07
A - Strange fuction
Time Limit:1000MS    Memory Limit:32768KB    64bit IO Format:%I64d & %I64u
SubmitStatusPracticeHDU 2899

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

2100200
 

Sample Output

-74.4291-178.8534
 


二分三分都可以做,三分更快些。

二分的做法是求导函数。然后求导函数为0的点的值便是最小值。


1.二分法(15ms)

#include<stdio.h>#include <math.h>double F1(double x, double y){return 42 * pow(x, 6) + 48 * pow(x, 5) + 21 * pow(x, 2) + 10 * x - y;}double calculate(double x, double y){return 6 * pow(x, 7) + 8 * pow(x, 6) + 7 * pow(x, 3) + 5 * pow(x, 2) - y*x;}int main(){int ynum;scanf("%d", &ynum);while (ynum--){double Y;scanf("%lf", &Y);double lit = pow(10.0, -5);double min = 0, max = 100;double mid = (max + min) / 2;while (min < max&&fabs(F1(mid, Y)) > lit){if (F1(mid, Y) > 0){max = mid;}else if (F1(mid, Y) < 0){min = mid;}elsebreak;mid = (max + min) / 2;}if (mid>0 && mid<100){printf("%.4f\n", calculate(mid,Y));}else{printf("0.0");}}return 0;}

2.三分法(0ms)

#include <stdio.h>#include <math.h>#define eps 1e-8double y;double cal(double x){        return  6 * pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-y*x;}int main(){        int t;        scanf("%d",&t);        while(t--)        {                scanf("%lf",&y);                double low=0,high=100;                double mid, midmid;                while ( low + eps < high )                {                    mid = (low + high) / 2;                    midmid = (mid + high ) / 2;                    double cmid = cal(mid);                    double cmidmid = cal(midmid);                    if ( cmid < cmidmid )                                    high = midmid;                    else                        low = mid;                }                printf("%.4lf\n",cal(high));        }        return 0;}


0 0
原创粉丝点击