洛谷 P1378 油滴扩展

来源:互联网 发布:云计算java工程师招聘 编辑:程序博客网 时间:2024/06/10 05:32

拿到题目没头绪,然后看到n<=6,就把这题变成了暴搜题。

枚举每个地方是不是可能放油滴。

油滴半径不能小于0呀。。

π的精确度得高一点,否则会被卡分。


#include<iostream>  #include<cmath>  using namespace std;    const float pi=3.1415926535;    int n,a1,b1,a2,b2,num,ans=100000000,beg;  long int s;  struct node  {      int x;      int y;//center of the circle      float r;//radious;      int flag;  }circle[7],que[7];  float ans2;    float dis(node x, node y)  {      float ans3;        ans3=sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));        return ans3;  }    void make()  {      int i,j;      float min1=10001;        if(num==n)      {          ans2=0;          for(i=1; i<=n; i++)              ans2+=pi*que[i].r*que[i].r;          ans2=s-ans2;            beg=(int)(ans2+0.5);            if(beg<ans)              ans=beg;            return;//到此是枚举完了判断符不符合题意      }        for(i=1; i<=n; i++)          if(circle[i].flag==false)          {              min1=10001;                circle[i].flag=true;                if(abs(circle[i].x-min(a1,a2))<min1)                  min1=abs(circle[i].x-min(a1,a2));              if(abs(circle[i].x-max(a1,a2))<min1)                  min1=abs(circle[i].x-max(a1,a2));              if(abs(circle[i].y-min(b1,b2))<min1)                  min1=abs(circle[i].y-min(b1,b2));              if(abs(circle[i].y-max(b1,b2))<min1)                  min1=abs(circle[i].y-max(b1,b2));                for(j=1; j<=num; j++)                  if(dis(circle[i],que[j])-que[j].r<min1)                      min1=dis(circle[i],que[j])-que[j].r;                if(min1<0)                  min1=0;//到此是求半径                circle[i].r=min1;              num++;              que[num]=circle[i];                make();                num--;              circle[i].r=0;              circle[i].flag=false;          }        return;  }    void read()  {      int i;        cin>>n>>a1>>b1>>a2>>b2;      for(i=1; i<=n; i++)      {          cin>>circle[i].x>>circle[i].y;          circle[i].r=0;          circle[i].flag=false;      }        s=abs(a2-a1)*abs(b2-b1);        make();        cout<<ans<<endl;        return;  }    int main()  {      read();      return 0;  }  
AC代码。

0 0