Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:graham居然超时了?吐血求指导In Reply To:graham居然超时了?吐血求指导 Posted by:bjrtest at 2012-11-16 16:58:17 > 难道是是因为用stl的原因 > #include <iostream> > #include <vector> > #include <algorithm> > #include <iomanip> > #include <stack> > #include <cmath> > using namespace std; > class point > { > public: > int x; > int y; > point(int x,int y):x(x),y(y) > { > ; > } > point() > { > ; > } > friend bool operator <(const point &a,const point &b); > friend int direct(point &a,point & b,point & c); > friend double length(point &a,point &b); > > static point base; > > }; > class Vector > { > public: > int x; > int y; > Vector(const point& a,const point& b) > { > this->x=b.x-a.x; > this->y=b.y-a.y; > } > int lengthsquar() > { > return this->x*this->x+this->y*this->y; > } > int cross(Vector & b) > { > return (this->x*b.y)-(this->y*b.x); > } > }; > > int direct(point &a,point & b,point & c) > { > Vector start(a,b),end(a,c); > int dir=start.cross(end); > if(dir<0) > { > //right > return 2; > } > if(dir>0) > { > //left > return 1; > } > if(0==dir) > { > return 0; > //middle > } > } > > double length(point &a,point &b) > { > return sqrt( (double)(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) ); > } > > bool operator <(point &a,point &b) > { > Vector va(point::base,a); > Vector vb(point::base,b); > int temp=va.cross(vb); > if(temp==0) > { > return va.lengthsquar()<vb.lengthsquar(); > } > else > { > return temp>0; > } > } > point point::base(0,0); > > > > > int main() > { > int n,around; > cin>>n>>around; > int i=n,j; > vector<point> vertice(1001); > vertice.clear(); > point input; > while(i--) > { > cin>>input.x>>input.y; > vertice.push_back(input); > } > point min(vertice[0]); > for(vector<point>::iterator iter=vertice.begin(); iter!=vertice.end(); iter++) > { > if(iter->y<=min.y) > { > if(iter->y==min.y) > { > min.x = iter->x<min.x?iter->x:min.x; > } > else > { > min=*iter; > } > } > } > point::base = min; > sort(vertice.begin(),vertice.end()); > vector<point> convex(1001); > convex.clear(); > for( i=0; i<3; i++) > { > convex.push_back(vertice[i]); > } > //i 是当前要测试是否加入凸包的点在vertice的下标 > i=3; > j=convex.size()-1; > while(i<vertice.size()) > { > if(1==direct(convex[j-1],convex[j],vertice[i])) > { > convex.push_back(vertice[i]); > i++; > } > else > { > convex.pop_back(); > } > j=convex.size()-1; > } > double sum=0; > vector<point>::iterator start,end; > for(end=start=convex.begin(),end++; end!=convex.end(); start++,end++) > { > sum+=length(*start,*end); > } > sum+=length(convex[convex.size()-1],convex[0]); > sum+=3.141592653*2*around; > cout<<fixed<<setprecision(0)<<sum<<endl; > > > } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator