posts - 64, comments - 4, trackbacks - 0, articles - 0

来源与分析:http://chenjianneng3.blog.163.com/blog/static/128345126201033101044920/

因为是求极值,所以要注意所求的数据范围,特别是最大,最小可能值。

2010 成都赛区的 Error Curves 就是典型的三分:

附上我的程序:

某某程序:


三分法小结:只要解在一点范围内满足凸函数性质就行,通俗点说就是两边夹,从两边不断逼近。

模版化
double Cal(Type a)
{
    /* 根据题目的意思计算 */
}

void Solve(void)
{
    double Left, Right;
    double mid, midmid;
    double mid_value, midmid_value;
    Left = MIN; Right = MAX;
    while (Left + EPS < Right)
    {
        mid = (Left + Right) / 2;
        midmid = (mid + Right) / 2;
        mid_value = Cal(mid);
        midmid_value = Cal(midmid);
        // 假设求解最大极值.
        if (mid_value >= midmid_value) Right = midmid;
        else Left = mid;
    }
}


poj3301cpp代码:
#include <cstdio>
#include 
<cmath>
#include 
<algorithm>
using namespace std;

const double PI = acos(-1.0
);
const double eps = 1e-8
;
const double maxn = 1000
;
int
 n;
double x[35],y[35
];

double cal(double
 a)
{
    
double
  bx ,by ,sx,sy;
    bx 
= by = -maxn ,sx = sy =
 maxn;
    
double
 tx,ty;
    
for (int i = 1; i <= n; i++
)
    {
         //tx,ty为坐标变换后的坐标,具体怎么推得忘了????
        tx 
= x[i] * cos(a) - y[i] *
 sin(a);
        ty 
= y[i] * cos(a) + x[i] *
 sin(a);
        
        bx 
=
 max(tx,bx);
        sx 
=
 min(tx,sx);
        
        by 
=
 max(ty,by);
        sy 
=
 min(ty,sy);
    }
    
return max(bx - sx , by -
 sy);
}

int
 main()
{
    
int
 t,i,j;
    
double
 lf,rt;
    
double
 m1,m2;
    
double
 m1_v,m2_v;
    scanf(
"%d",&
t);
    
while (t--
)
    {
        scanf(
"%d",&
n);
        
for (i = 1; i <= n; i++
)
            scanf(
"%lf %lf",&x[i],&
y[i]);
        lf 
= 0.0; rt = PI/2
;
        
while (lf + eps <
 rt)
        {
            m1 
= (lf + rt) / 2
;
            m2 
= (m1 + rt) / 2
;
            m1_v 
=
 cal(m1);
            m2_v 
=
 cal(m2);
            
if (m1_v <=
 m2_v)
                rt 
=
 m2;
            
else lf =
 m1;
        }
        
double len =
 cal(lf);
        printf(
"%.2lf\n",len*
len);
    }
    
return 0
;
}


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理