当前位置: 代码迷 >> 综合 >> 二分:HDU2899,2199
  详细解决方案

二分:HDU2899,2199

热度:7   发布时间:2023-12-22 14:12:42.0

2899.Strange fuction

题意:找到当x取值在0到100是F(x)的最小值。

思路:感觉这就是一道数学题,F(x)在[0,100]内的的最小值即为拐点(一阶导数为0),再用二分找一下答案就行了。

代码实现:

#include<stdio.h>
typedef long long ll;
const double rp=1e-7;
ll y;
double f(double x)
{
    return 42*x*x*x*x*x*x+48*x*x*x*x*x+21*x*x+10*x-y;
}
double F(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; scanf("%d",&t);while(t--){
    scanf("%lld",&y);double l=0,r=100,mid;while(r-l>rp){
    mid=(l+r)/2;if(f(mid)-0>=rp) r=mid;else l=mid;}printf("%.4f\n",F(l));}return 0;
}

同理也可以练习HDU的2199题

[2199.Can you solve this equation?]

AC代码:

#include<bits/stdc++.h>
using namespace std;
const double p=1e-7;
double f(double x)
{
    return 8*x*x*x*x+7*x*x*x+2*x*x+3*x+6;
}
int main()
{
    int T; cin>>T;double y;while(T--){
    scanf("%lf",&y);if(6-y>p||y-f(100.0)>p){
    printf("No solution!\n");continue;}double l=0,r=100;while(r-l>p){
    double mid=(l+r)/2;if(f(mid)-y>=p) r=mid;else l=mid;}printf("%.4f\n",r);}return 0;
}