类似凸包的做法WA了九个点求助
查看原帖
类似凸包的做法WA了九个点求助
329698
youdu666楼主2022/8/26 14:09

RT

感觉也没毛病,不也是绕了一圈走完所有点么

#include<cstdio>
#include<bitset>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
inline int read()
{
	int x=0,y=1;
	char c=getchar();
	while(c>'9'||c<'0')
	{
		if(c=='-')
		y=-1;
		c=getchar();
	}
	while(c<='9'&&c>='0')
	{
		x=x*10+c-'0';
		c=getchar();
	}
	return x*y;
}
const int N=1005;
struct point{
	double x,y;
}a[N];
int n;
bool cmp(point u,point v)
{
	return ((u.x-a[1].x)/(u.y-a[1].y))>((v.x-a[1].x)/(v.y-a[1].y));
}
inline double js(double xa,double ya,double xb,double yb)
{
	return sqrt((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb));
}
signed main()
{
	n=read();
	for(int i=1;i<=n;i++)
	a[i]=(point){(double)(read()),(double)(read())};
	int mny=2e9,mnyx=2e9,mnn=0;
	for(int i=1;i<=n;i++)
	{
		if(a[i].y<mny||(a[i].y==mny&&a[i].x<mnyx))
		mny=a[i].y,mnyx=a[i].x,mnn=i;
	}
	a[0]=a[1];
	a[1]=a[mnn];
	a[mnn]=a[0];
	sort(a+2,a+n+1,cmp);
//	for(int i=1;i<=n;i++)
//	printf("%lf %lf\n",a[i].x,a[i].y);
	double ans=0;
	for(int i=1;i<n;i++)
	ans+=js(a[i].x,a[i].y,a[i+1].x,a[i+1].y);
	ans+=js(a[n].x,a[n].y,a[1].x,a[1].y);
	printf("%.2lf",ans);
}
2022/8/26 14:09
加载中...