rrc12345 2022-06-12 13:32 采纳率: 83.3%
浏览 15
已结题

关于面积的问题,如何解决?

问题遇到的现象和发生背景

平面内有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,得满分。

  • 写回答

1条回答 默认 最新

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月19日
  • 创建了问题 6月12日

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用