2019年5月4日

总结

今天我们来看二分的题目。
(做起来一开始真的没思路,只能上网参考。。。)

例题

现在,给定方程8 * x ^ 4 + 7 * x ^ 3 + 2 * x ^ 2 + 3 * x + 6 == Y,找到0到100之间的解,出一个实数(精确到4个小数位)。

这是个解方程的问题,我们要用二分解决。

const double preci=1e-8;
double cal(double a)
{
    return 8*a*a*a*a+7*a*a*a+2*a*a+3*a+6;//单独写个函数
}
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        double y;
        scanf("%lf",&y);
        if(y<cal(0)||y>cal(100))//如果不合题意
        {
            printf("No solution!\n");
            continue;
        }
        double left=0,right=100;
        double mid;
        while(right-left>1e-6)//1e-6=0.000001
        {
            mid=(right+left)/2;
            if(cal(mid)>y)right=mid;//如果大的话,上限减小
            else left=mid;//否则下限上调
        }
        printf("%.4f\n",mid);//按规格输出
    }
}
  F(x)= 6 * x ^ 7 + 8 * x ^ 6 + 7 * x ^ 3 + 5 * x ^ 2-y * x(0 <= x <= 100)
当x介于0和100之间时,您能找到最小值吗?

这个套路和之前一样,就是y这个需要解决。
一般来说真想不起来求导。

double df(double x)//求导
{
 return 42*pow(x,6)+48*pow(x,5)+21*x*x+10*x;
}
double f(double x,double y)
{
 return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*x*x-y*x;
}
int main()
{
 int t,i;
 double y,left,right,mid;
 scanf("%d",&t);
 while(t--)
 {
  scanf("%lf",&y);
  left=0,right=100;
  for(i=1;i<=100;i++)
  {
   mid=(left+right)/2;
   if(df(mid)>y)
    right=mid;
   else
    left=mid;
  }
  printf("%.4lf\n",f(mid,y));
 }
 return 0;
}

感慨

假期结束,回校喽。
话说我感觉自己越来越不适应acm的课了。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值