zoukankan      html  css  js  c++  java
  • 三分模板

    三分模板

    三分整数模板

    整数的三分可能具有不确定性,可以通过改变while循环的条件(while(l + 5 < r))来缩小范围,再通过

    for(int i = l; i <= r; i++)
          ans = min(ans, calc(i));
    for(int i = 1; i <= r; i++)
          ans = max(ans, calc(i));
    
    //更新方式改成
    l = lmid
    r = rmid
    

    来确定答案,下面的模板仅供参考,如果(WA)了,可以考虑通过这种方式改进。

    凸函数的极大值

    ll l, r;
    while(l < r) {
        ll lmid = l + (r - l) / 3;
        ll rmid = r - (r - l) / 3;
        if(calc(lmid) <= calc(rmid))	l = lmid + 1;
        else r = rmid - 1;
    }
    printf("%lld
    ", max(calc(l), calc(r)));
    

    凹函数的极小值

    ll l, r;
    while(l < r) {
        ll lmid = l + (r - l) / 3;
        ll rmid = r - (r - l) / 3;
        if(calc(rmid) >= calc(lmid))	r = mid - 1;
        else 	l = mid + 1;
    }
    printf("%lld
    ", min(calc(l), calc(r)));
    

    三分小数模板

    凸函数的极大值

    double l, r;
    for(int i = 0; i < 300; i++) {
        double lmid = l + (r - l) / 3;
        double rmid = r - (r - l) / 3;
        if(calc(lmid) <= calc(rmid))	l = lmid;
        else 	r = rmid;
    }
    printf("%.6f
    ", calc(l));
    

    凹函数的极小值

    double l, r;
    for(int i = 0; i < 300; i++) {
        double lmid = l + (r - l) / 3;
        double rmid = r - (r - l) / 3;
        if(calc(rmid) >= calc(lmid))	r = rmid;
        else 	l = lmid;
    }
    printf("%.6f
    ", calc(l));
    
  • 相关阅读:
    面试(转)
    Expression Blend实战开发技巧
    Twelve Principles of Agile Software
    Test Software Engineer
    Web开发工程师必读的15个设计博客
    麻省理工的C/C++的课程
    Orchard:处理1对多的关系
    DotNetNuke Switches to C# !!
    我的那个他
    2011 微软MVP全球大会
  • 原文地址:https://www.cnblogs.com/lifehappy/p/12926640.html
Copyright © 2011-2022 走看看