• BZOJ3680 吊打xxx


    爬山。

    爬山算法即是模拟爬山的过程,随机选择一个位置爬山,每次朝着更高
    的方向移动,直到到达山顶,即每次都在临近的空间中选择最优解作为
    当前解,直到局部最优解。这样算法会陷入局部最优解,能否得到全局
    最优解取决于初始点的位置。初始点若选择在全局最优解附近,则就可
    能得到全局最优解。

    http://www.matrix67.com/blog/archives/422

    By:大奕哥

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int n;
     4 double ansx,ansy;
     5 struct node{
     6     double x,y;
     7     int w;
     8 }p[10005];
     9 double sqr(double x){return x*x;}
    10 double dis(double x,double y,node b){
    11     return sqrt(sqr(x-b.x)+sqr(y-b.y));
    12 }
    13 void hillclimb()
    14 {
    15     double t=1000,x,y;
    16     for(int i=1;i<=n;++i)
    17     ansx+=p[i].x*p[i].w,ansy+=p[i].y*p[i].w;
    18     ansx/=n;ansy/=n;
    19     while(t>1e-9)
    20     {
    21         x=y=0;
    22         for(int i=1;i<=n;++i)
    23         {
    24             x+=(p[i].x-ansx)*p[i].w/dis(ansx,ansy,p[i]);
    25             y+=(p[i].y-ansy)*p[i].w/dis(ansx,ansy,p[i]);
    26         }
    27         ansx+=x*t;ansy+=y*t;
    28         if(t>0.5)t*=0.5;
    29         else t*=0.97;
    30     }
    31     printf("%.3lf %.3lf",ansx,ansy);
    32 }
    33 int main()
    34 {
    35     scanf("%d",&n);
    36     for(int i=1;i<=n;++i)
    37         scanf("%lf%lf%d",&p[i].x,&p[i].y,&p[i].w);
    38     hillclimb();
    39     return 0;
    40 }
  • 相关阅读:
    C puzzles详解【51-57题】
    C puzzles详解【46-50题】
    C puzzles详解【38-45题】
    C puzzles详解【34-37题】
    C puzzles详解【31-33题】
    C puzzles详解【26-30题】
    C puzzles详解【21-25题】
    C puzzles详解【16-20题】
    使用C++模板实现栈的求最小值功能
    模拟求幂运算,考虑的已经很周全了
  • 原文地址:https://www.cnblogs.com/nbwzyzngyl/p/8244865.html
Copyright © 2020-2023  润新知