pku(1113)wall

作者在 2008-04-12 11:23:49 发布以下内容

这道题是典型的凸包题

关于凸包的算法可以去http://baike.baidu.com/view/707209.htm这里看到。

 

题目的意思就是求凸包周长再加上一个圆的面积.

 

这到题让我知道了,原来排序是sort()和qsort()都是不稳定的,为此我wa了很多次。

 

最后还是做出来,不容易啊。

 

代码:

 

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <math.h>
#define pi 3.141592653589
using namespace std;
typedef struct p
{
 int x;
 int y;
 double ji;
}vv;
vector <vv> a;
 bool __inline cmp(vv p1,vv p2)
 {

  if(p1.ji<p2.ji) return true;
  else if(p1.ji>p2.ji) return false;
  else if(p1.y<p2.y||(p1.y==p2.y&&p1.x<p2.x)) return true;
  else
   return false;
 };
int minn(vv *v,int n)
{
 int xm=10000000;
 int ym=10000000;
 int temp;
 for(int i=0;i<n;i++)
 {
  if(v[i].y<ym||(v[i].y==ym&&v[i].x<xm))
  {
   xm=v[i].x;
   ym=v[i].y;
   temp=i;
  }
 }
 return temp;
}
double des(int i ,int j)
{
 double x=a[i].x-a[j].x;
 double y=a[i].y-a[j].y;
 return x*x+y*y;
}


void mul(vv *v,int n)
{
 int temp;
 temp=minn(v,n);
 swap(v[n-1],v[temp]);
 for(int i=0;i<n-1;i++)
 {
  v[i].ji=atan2(double(v[i].y-v[n-1].y),double(v[i].x-v[n-1].x));
 }
 return ;
}
void gram(vv *v,int n)
{
   for(int i=2;i<n-1;i++)
   {
    bool index=true;
    while(index)
    {
       int ax,ay;
       int bx,by;
    int b=a.size();
       ax=v[i].x-a[b-2].x;
       ay=v[i].y-a[b-2].y;
       bx=a[b-1].x-a[b-2].x;
       by=a[b-1].y-a[b-2].y;
      if(ax*by-bx*ay>0&&a.size()>2)
   {
     a.pop_back();
   }
      else
   {
     a.push_back(v[i]);
     index=false;
   }
    }
   }
   return ;
}
int main()
{
 int n,lon;
 int ans;
 double tans;
 cin >>n>>lon;
 vv *v=new vv[n+1];
 for(int i=0;i<n;i++)
 {
  cin >>v[i].x>>v[i].y;
 }
    mul(v,n);
 sort(v,v+n-1,cmp);
  
 a.push_back(v[n-1]);
 a.push_back(v[0]);
 a.push_back(v[1]);
 gram(v,n);

 tans=0.0;

 for(int j=1;j<a.size();j++)
 {
  tans+=sqrt(des(j,j-1));
 }
 tans+=sqrt(des(a.size()-1,0));
 tans+=pi*2*lon;
 cout<<int(tans+0.5)<<endl;

    return 0;
 
}

acm | 阅读 3042 次
文章评论,共0条
游客请输入验证码
浏览255976次