问题遇到的现象和发生背景
平面内有n个点,每个点坐标为xi,yi,统计其中所有三角形面积之和(无论它们是否重叠)。输出保留一位小数。
样例输入:
5 //这一行是n
0 1 //下面n行是xi,yi
1 0
1 1
2 1
1 2
样例输出:
6.0
数据范围:
n<=3000
|xi|,|yi|<=1e4
问题相关代码,请勿粘贴截图
#include<bits/stdc++.h>
using namespace std;
int n;
double s=0.0;
struct node{
int x,y;
}a[3001];
bool cmp(node a,node b){
if(a.x!=b.x){
return a.x<b.x;
}
return a.y<b.y;
}
//判断向量AC在向量AB的哪个方位,true表示逆时针,false表示顺时针
bool dir(node a,node b,node c){
int x1=b.x-a.x,x2=c.x-a.x,y1=b.y-a.y,y2=c.y-a.y;
return x1*y2-x2*y1>0;
}
//求三角形面积
double area(node a,node b,node c){
return fabs(0.5*(a.x*b.y+b.x*c.y+c.x*a.y-a.x*c.y-b.x*a.y-c.x*b.y));
}
void calc(bool flag,int l,int r){
double tmp=-1.0;
int k=0;
for(int i=l+1;i<=r-1;i++){
if(dir(a[l],a[r],a[i])!=flag){
continue;
}
double t=area(a[l],a[r],a[i]);
if(tmp<t){
tmp=t;
k=i;
}
}
if(k==0){
return ;
}
s+=tmp;
calc(flag,l,k);
calc(flag,k,r);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
}
sort(a+1,a+n+1,cmp);
//分治法求凸包面积
calc(true,1,n);
calc(false,1,n);
printf("%.1lf",s*(n-2));
return 0;
}
运行结果及报错内容
Wrong Answer,24分(满分100分)。
我的解答思路和尝试过的方法
我先画了几张图找了找规律,然后得出(错误的)结论:面积和=凸包面积*(n-2),于是套用了这个公式。
我想要达到的结果
AC,得满分。