Balloons in box

data:
3
0 0
10 10
3 5
2 1
7 7
  1. #include<iostream>
  2. #include<cmath>
  3. #include<string>
  4. #include<vector>
  5. using namespace std;
  6. const double PI = 3.14;
  7. int N;
  8. double lu[2];
  9. double rd[2];
  10. vector<vector<double> > data;
  11. vector<vector<double> > dist;
  12. //recursive search the area
  13. double getArea(int cur,double* r,bool* visited,int* next,double area)
  14. {
  15.     double w = min(abs(lu[0] - data[cur][0]),abs(rd[0] - data[cur][0]));
  16.     double h =  min(abs(lu[1] - data[cur][1]),abs(rd[1] - data[cur][1]));
  17.     double radius = min(w,h);
  18.     for(int i = 0;i<N;i++)
  19.     {
  20.         if(i == cur)
  21.             continue;
  22.         double d = dist[cur][i];
  23.         if(visited[i])
  24.         {
  25.             radius = min(radius,d - r[i]);
  26.         }
  27.         else
  28.         {
  29.             radius = min(radius,d);
  30.         }
  31.     }
  32.     area += PI * radius * radius;
  33.     visited[cur]  = true;
  34.     r[cur] = radius;
  35.     double subarea = 0;
  36.     int index = -1;
  37.     for(int i = 0; i<N ;i++)
  38.     {
  39.         if(visited[i])
  40.             continue;
  41.         double aa = getArea(i,r, visited,next,area);
  42.         if(aa > area)
  43.         {
  44.             area = aa;
  45.             index = i;
  46.         }
  47.     }
  48.     next[cur] = index;
  49.     visited[cur] = false;
  50.     return area;
  51. }
  52. int main()
  53. {
  54.     // read the input
  55.     cin>>N;
  56.     cin>>lu[0]>>lu[1];
  57.     cin>>rd[0]>>rd[1];
  58.     data.resize(N);
  59.     for(int i = 0;i<N;i++)
  60.     {
  61.         data[i].resize(2);
  62.         for(int j= 0;j<2;j++)
  63.         {
  64.             cin>>data[i][j];
  65.         }
  66.     }
  67.     /*
  68.      * calculate
  69.      */
  70.     
  71.     //all distance
  72.     dist.resize(N);
  73.     for(int i = 0;i<N;i++)
  74.     {
  75.         dist[i].resize(N);
  76.         for(int j  = 0;j<i;j++)
  77.         {
  78.             dist[i][j] = sqrt((data[i][0]- data[j][0])* (data[i][0]- data[j][0]) + (data[i][1]- data[j][1]) * (data[i][1]- data[j][1]) );
  79.             dist[j][i] = dist[i][j];
  80.         }
  81.     }
  82.     double* r = new double[N];
  83.     bool* visited = new bool[N];
  84.     int* next = new int[N];
  85.     double maxArea = 0;
  86.     int* order = new int[N];
  87.     int index = -1;
  88.     for(int i = 0;i< N;i++)
  89.     {
  90.         for(int j = 0;j<N;j++)
  91.         {
  92.             r[j]= 0;
  93.             visited[j] = false;
  94.             next[j] = -1;
  95.         }
  96.     // begin the search from the point i
  97.         double area = getArea(i,r,visited,next,0);
  98.         if(area >maxArea)
  99.         {
  100.             maxArea = area;
  101.             index = i;
  102.             for(int j = 0;j<N;j++)
  103.             {
  104.                 order[j] = next[j];
  105.             }
  106.         }
  107.     }
  108.     while(index!= -1)
  109.     {
  110.         cout<<index<<endl;
  111.         index = order[index];
  112.     }
  113.     delete[] visited;
  114.     delete[] r;
  115.     delete[] next;
  116. }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值