acm解题报告 HDU 2899 Strange fuction
2015-07-23 09:53
543 查看
首先将方程求导,发现从0到导数为零的范围,原方程递减,之后方程递增,所以求出导数为0的点即为最小值点,与
HDU 2199 类似,通过二分的方法找到精确的最小值点,然后带到原方程中即得到最小值。
源代码:
#include<stdio.h>
double cal1(double x, double y){
double a = 6 * x*x*x*x*x*x*x + 8 * x*x*x*x*x*x + 7 * x*x*x + 5 * x*x - x*y;
return a;
}
double cal2(double x){
double a = 42 * x*x*x*x*x*x + 48 * x*x*x*x*x + 21 * x*x + 10 * x;
return a;
}
int main(){
int t;
scanf("%d", &t);
while (t--){
double y;
scanf("%lf", &y);
if (y >= 42480000211000)printf("%.4f", cal1(100, y));
else if (y <= 0)printf("%.4f", 0 * y);
else {
double high = 100, mid = 50, low = 0;
while ((high - low) >= 0.000005){
if (cal2(mid) > y){
high = mid;
mid = (high + low) / 2;
}
else {
low = mid;
mid = (high + low) / 2;
}
}
printf("%.4f\n", cal1(mid, y));
}
}
return 0;
}
HDU 2199 类似,通过二分的方法找到精确的最小值点,然后带到原方程中即得到最小值。
源代码:
#include<stdio.h>
double cal1(double x, double y){
double a = 6 * x*x*x*x*x*x*x + 8 * x*x*x*x*x*x + 7 * x*x*x + 5 * x*x - x*y;
return a;
}
double cal2(double x){
double a = 42 * x*x*x*x*x*x + 48 * x*x*x*x*x + 21 * x*x + 10 * x;
return a;
}
int main(){
int t;
scanf("%d", &t);
while (t--){
double y;
scanf("%lf", &y);
if (y >= 42480000211000)printf("%.4f", cal1(100, y));
else if (y <= 0)printf("%.4f", 0 * y);
else {
double high = 100, mid = 50, low = 0;
while ((high - low) >= 0.000005){
if (cal2(mid) > y){
high = mid;
mid = (high + low) / 2;
}
else {
low = mid;
mid = (high + low) / 2;
}
}
printf("%.4f\n", cal1(mid, y));
}
}
return 0;
}