三分算法求最值_weixin_30685029的博客-程序员秘密

技术标签: java  c/c++  

假如是一个凸型函数,如何寻找最值呢?

发现图中斜率是单调递减的,二分找到斜率为0的点?(似乎在这个图中,是可行的)

下面介绍一种普遍求凹凸型函数的做法——三分法

 

如图,mid=(left+right)/2,mmid=(mid+right)/2

如果,f(mid)< f(mmid),则[left,mid]可以被舍弃了,left=mid;

   else   ,则[mmid,right]可以被舍弃了,right=mmid;

直到最后剩下3个点,找出最值就行了

 //凹函数     
 ll l1=0,r1=l,mid,mmid;
        
        while(l1<r1-2)
        {
            mid=(l1+r1)/2;
            mmid=(mid+r1)/2;
            
            if(fun(mid)>fun(mmid))
                l1=mid;
            else r1=mmid;
        }
    mid=(l1+r1)/2;
    printf("%lld\n",min(fun(mid),min(fun(l1),fun(r1))));    

题目链接

 

java代码,用C++写要注意超long long

 1 import java.math.BigDecimal;
 2 import java.util.Scanner;
 3 import java.util.HashMap;
 4 import java.math.BigInteger;
 5 public class Main{
 6     static BigInteger min2(BigInteger x,BigInteger y)
 7     {   
 8         if(x.compareTo(y)==1) return y;
 9         else return x;
10     }
11     static BigInteger[] d= new BigInteger[200005];
12     static BigInteger[] f= new BigInteger[200005];
13     static BigInteger[] pre= new BigInteger[200005];
14     static BigInteger[] suf= new BigInteger[200005];
15     static BigInteger a,b,m;
16     public static void main(String[] args) {
17         Scanner cin = new Scanner(System.in);
18         int l;
19         m=cin.nextBigInteger();
20         l=cin.nextInt();
21         pre[0]=BigInteger.valueOf(0);
22         for(int i=1;i<=l;i++)
23             {
24             d[i]=cin.nextBigInteger();
25             f[i]=cin.nextBigInteger();
26             pre[i]=pre[i-1].add(d[i].multiply(d[i]).multiply(f[i]));
27             }
28         suf[l+1]=BigInteger.valueOf(0);
29         for(int i=l;i>=1;i--)
30             {
31                 suf[i]=suf[i+1].add(m.multiply(f[i]));
32             }
33          
34         int q;
35         q=cin.nextInt();
36         while(q--!=0)
37         {
38              
39             a=cin.nextBigInteger();
40             b=cin.nextBigInteger();
41             int l1=0,r1=l,mid,mmid;
42             while(l1<r1-2)
43             {
44                 mid=(l1+r1)/2;
45                 mmid=(mid+r1)/2;
46                 if(a.multiply(pre[mid]).add(b.multiply(suf[mid+1])).compareTo(a.multiply(pre[mmid]).add(b.multiply(suf[mmid+1])))==1)
47                     l1=mid;
48                 else r1=mmid;
49             }
50             mid=(l1+r1)/2;
51             System.out.println(min2(a.multiply(pre[mid]).add(b.multiply(suf[mid+1])),min2(a.multiply(pre[l1]).add(b.multiply(suf[l1+1])),a.multiply(pre[r1]).add(b.multiply(suf[r1+1])))));
52              
53              
54         }
55     }        
56     
57                 
58                 
59 }
View Code

 

转载于:https://www.cnblogs.com/lnu161403214/p/8994255.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30685029/article/details/99907654

智能推荐

Android 中的单元测试(使用AndroidTestCase 进行 Content Provider 测试)_瓦力冫的博客-程序员秘密

Android官方的解释是:Extend this if you need to access Resources or other things that depend on Activity Context.,如果你需要用到资源或者Activity Content,可以继承这个类进行单元测试。我们这里拿Android中例子 “NotePad” 中的Content Provider来做测试。

Python中列表、元组、字典和集合的区别_我是一名程序猿的博客-程序员秘密

这里用一个表格来展示:数据结构 是否可以改变 是否重复 是否有序 定义符号 列表(list) 可变 可以重复 有序 [ ] 元组(tuple) 不可变 可以重复 有序 ( ) 字典(dictionary) 可变 可重复 无序 {key:value} 集合 可变 不可重复...

C# 使用NPOI生成Excel文件——合并单元格、设置Style_chusi9734的博客-程序员秘密

using System; using System.IO; using NPOI.HSSF; using NPOI.HPSF; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; //导出常用方法示例(使用该方法时需先引入NPOI.dll...

在 VS 上开如何发使用 Mingw64 的 DLL_车斗的博客-程序员秘密

在 VS 上开如何发使用 Mingw64 的 DLL系统要求Win10 上安装了 VS2015, msys2 (mingw64 + gtk) (参考 https://blog.csdn.net/ubuntu64fan/article/details/117959904)VS 上开发跨平台的窗口程序使用了 gtk (libgtk-3-0.dll),这个可以在 mingw64 的目录下找到。我的:C:\DEVPACK\msys64\mingw64\bin这个目录下的所有 dll 都是需要的。其中我的

随便推点

初识UE4 VR开发二_ue4 vr c++_小小白的博客的博客-程序员秘密

初识UE4 VR开发二C++类中的属性作用域publicprivateprotectedC++中的友元函数上次文章写了一部分,因为太晚了,为了我的头发着想,于是就睡觉了,今儿来补充一点内容,想要看上一篇文章的就点一下我的博客吧。C++类中的属性作用域简单来说只有三个,即public、private、protected。用法如下代码所示(由于我懒得重新打,就复制了一下上一篇博客):class...

怎样用计算机添加标题,如何在excel图表中添加标题 如何更改Excel图表中标题的字体..._weixin_39765796的博客-程序员秘密

在Excel中使用图表可以使表格更具可读性,尤其是可以在几秒钟内找到关键指标。在本教程中,我们将在图例中添加图例,而且还将自定义图例的外观,尤其是字体及其颜色。在Excel中为图表添加标题单击要向其添加图例的图表,单击“图表元素+”按钮 ,然后单击“图例”。要更改图例的位置,请单击图例右边的箭头,然后选择所需的位置。默认情况下,图例不允许与图表重叠。但是,如果空间不足,可以通过单击“更多”选项,然...

hive load data inpath ‘‘ overwrite into 坑_hive load overwrite_lcl_bigdata的博客-程序员秘密

load data inpath 'dataDir/dim_url.csv' overwrite into table dim_url partition(day='2021-03')注意:1,以前都是加载本地数据,写法:load data local inpath '' ...2,如果加载hdfs上的数据,要去掉local上传hdfs:hdfs dfs -put /dataDir/dim_urlAnalysisType.csv /user/root/dataDir 报错: ..

ogre的主要渲染流程_cibei9127的博客-程序员秘密

很早以前就想写一些关于OGRE的文章了,一直没机会。理解一个渲染引擎,我觉得最重要的是先抓住了它的主架构,它的主线,渲染流程,不然的话,一个引擎几万行,甚至几十万行的代码,光是打开solution就能吓你一跳了,OGRE也有十几万行的代码量,我一开始看它的时候也是无从下手...

shell脚本的基础知识_搞什么滚去学习的博客-程序员秘密

一、Shell脚本概述1.1Shell基本概念将要执行的命令按顺序保存到一个文本文件给该文件可执行权限可结合各种Shell控制语句以完成更复杂的操作1.2 Shell脚本应用场景重复性操作交互性任务批量事务处理服务运行状态监控定时任务执行1.3 Shell作用——翻译官shell是一个特殊的应用程序,它介于操作系统内核和用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。二、shell编程规范2.1 用

linux traceroute追踪路由路径_zhaomax的博客-程序员秘密

TraceRoute的工作原理  1.TraceRoute的工作原理:      traceroute 有使用两种:使用ICMP的和使用UDP的。Microsoft      使用ICMP,所以win95上发出的traceRT应使用的是ICMP,但我没有用 sniffer查过;其它包括unix和cisco router都使用UDP.      ICMP traceroute:     ...

推荐文章

热门文章

相关标签