hdoj1392
30135 단어 OJ
/***************************************************************\
*Author:Hu Wenbiao
*Created Time: Sat 21 Aug 2010 10:33:05 AM CST
*File Name: main.cpp
*Description: 。 。Graham's scan
\***************************************************************/
//*========================*Head File*========================*\\
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
/*----------------------*Global Variable*----------------------*/
struct POINT{
int x,y;
}P[40000];
int Q[40000];
int top,n;
//*=======================*Main Program*=======================*//
using namespace std;
int cmp(const void* i,const void* j){// 0->i->j , i
POINT *a=(POINT*)i,*b=(POINT*)j;
int tmp=(a->x-P[0].x)*(b->y-P[0].y)-(a->y-P[0].y)*(b->x-P[0].x);
if(tmp>0)
return -1;
else if(tmp<0)
return 1;
else{// 0->i->j , 0 ,
// 0->1->2 , ,
// 。
int dx=a->x-P[0].x,dy=a->y-P[0].y;
int da=dx*dx+dy*dy;
dx=b->x-P[0].x,dy=b->y-P[0].y;
int db=dx*dx+dy*dy;
return da-db;
}
}
int cross(int a,int b,int c){// (P[a],P[b]),(P[a],P[c])
int x1=P[b].x-P[a].x,y1=P[b].y-P[a].y;
int x2=P[c].x-P[a].x,y2=P[c].y-P[a].y;
return x1*y2-y1*x2;
}
int main(){
//freopen("input","r",stdin);
while(scanf("%d",&n)!=EOF&&n){
int _min=0;//P[_min] , y ,
for(int i=0;i<n;i++){
scanf("%d%d",&P[i].x,&P[i].y);
if(P[i].y<P[_min].y)
_min=i;
else if(P[i].y==P[_min].y&&P[i].x<P[_min].x)
_min=i;
}
if(n==1){
printf("0.00
");
continue;
}
else if(n==2){
printf("%.2lf
",sqrt(1.0*(P[0].x-P[1].x)*(P[0].x-P[1].x)+(P[0].y-P[1].y)*(P[0].y-P[1].y)));
continue;
}
swap(P[0],P[_min]);
qsort(&P[1],n-1,sizeof(POINT),cmp);
top=0;
Q[top++]=0;
Q[top++]=1;
for(int i=2;i<n;i++){
while(cross(Q[top-2],Q[top-1],i)<=0)//
top--;
Q[top++]=i;
}
//
double ans=sqrt(1.0*(P[Q[top-1]].x-P[Q[0]].x)*(P[Q[top-1]].x-P[Q[0]].x)+(P[Q[top-1]].y-P[Q[0]].y)*(P[Q[top-1]].y-P[Q[0]].y));
for(int i=1;i<top;i++){
ans+=sqrt(1.0*(P[Q[i]].x-P[Q[i-1]].x)*(P[Q[i]].x-P[Q[i-1]].x)+(P[Q[i]].y-P[Q[i-1]].y)*(P[Q[i]].y-P[Q[i-1]].y));
}
printf("%.2lf
",ans);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
9도 OJ 1116: 가감승제(기초문제)시간 제한: 1초 메모리 제한: 32메가바이트 특수 판제: 아니요 제출: 1466 해결 방법: 902 제목 설명: 입력한 연산자에 따라 입력한 정수에 대해 간단한 정수 연산을 진행한다.연산자는 더하기 +, 빼기 -,...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.