C - Strange fuction
2016-07-21 15:33
127 查看
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
先求导数,可以看出在0到100区间里面是单峰函数,主要是用二分法求导数为0的地方,注意小数位数,我的代码弄得比较复杂了。
代码如下:
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
先求导数,可以看出在0到100区间里面是单峰函数,主要是用二分法求导数为0的地方,注意小数位数,我的代码弄得比较复杂了。
代码如下:
#include <iostream> #include <cmath> #include <algorithm> #include <iomanip> #define EXP 1e-9 using namespace std; double y; double f(double x) { return 42 * pow(x,6) + 48 * pow(x,5) + 21 * pow(x,2) + 10 * x - y; } double bs() { double lo = 0, hi = 100; double mi, ans = hi + 1; while(lo + EXP < hi) { mi = (lo + hi) / 2.0; if(f(mi) < 0) { lo = mi; if(ans = hi + 1) ans = mi; max(mi, ans); } else { hi = mi; min(mi, ans); } //cout << lo << " " << hi << endl; } //cout << ans << endl; if(ans == 100 + 1) return -1; return ans; } int main() { int t; cin >> t; while(t--) { cin >> y; double temp = bs(); //cout << temp << endl; //cout << fixed << setprecision(5) << (6 * pow(temp,7) + 8 * pow(temp,6) + 7 * pow(temp,3) + 5 * pow(temp,2) - y * temp) * 10000 << endl; if(temp != -1.0) { if((6 * pow(temp,7) + 8 * pow(temp,6) + 7 * pow(temp,3) + 5 * pow(temp,2) - y * temp) * 10000 >= 0) cout << fixed << setprecision(4) << (long long)((6 * pow(temp,7) + 8 * pow(temp,6) + 7 * pow(temp,3) + 5 * pow(temp,2) - y * temp) * 10000 + 0.5) / 10000.0 << endl; else cout << fixed << setprecision(4) << (long long)((6 * pow(temp,7) + 8 * pow(temp,6) + 7 * pow(temp,3) + 5 * pow(temp,2) - y * temp) * 10000 - 0.5) / 10000.0 << endl; } else { //cout << "?" << endl; if(f(0) >= 0 && f(100) >= 0) cout << fixed << setprecision(4) << (double)0 << endl; else cout << fixed << setprecision(4) << (long long)((6 * pow(100,7) + 8 * pow(100,6) + 7 * pow(100,3) + 5 * pow(100,2) - y * 100) * 10000 - 0.5) / 10000.0 << endl; } } return 0; }
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM程序设计大赛题目分类
- 2015年acm国内排名
- 计算字符串最后一个单词长度
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 快速排序里的学问:从猜数字开始
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 初学ACM - 组合数学基础题目PKU 1833