poj - 3855 - Blast the Enemy!

本文介绍了一道POJ上的几何模版题,重点在于解决重心坐标输出时可能出现的负数问题,通过使用%f输出避免了-0.000000的情况。文中分享了作者及师弟的解题过程与心得。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:求一个n边形重心(n <= 100)。

题目链接:http://poj.org/problem?id=3855

——>>一道几何模版题,敲了3份模版,坑了近5个小时,最后3分钟A过……大哭

其实所有的解法就一个问题:当重心为(0, 0)时,若以 %lf 输出,可能会出现-0.000000的情况,而正解应为0.000000,此时,用 %f 输出就能避免这个问题(最后发现,师弟的写法较赛时我所敲的3份模版都要精辟,学习了~微笑)。

#include <cstdio>

using namespace std;

const int maxn = 100 + 10;
int n, kase = 1;

struct Point{
    double x, y;
    Point(double x = 0, double y = 0):x(x), y(y){}
}v[maxn];

double Cross(Point A, Point B){     //叉积,三角形有向面积的2倍
    return A.x * B.y - B.x * A.y;
}

Point barycenter(Point p[], int n){
    Point ret;
    double area = 0;
    for(int i = 1; i < n; i++){
        double area2 = Cross(p[i-1], p[i]);     //上下都取面积的2倍,最后会被约掉的
        ret.x += (p[i-1].x + p[i].x) / 3 * area2;
        ret.y += (p[i-1].y + p[i].y) / 3 * area2;
        area += area2;
    }
    double area2 = Cross(p[n-1], p[0]);
    ret.x += (p[n-1].x + p[0].x) / 3 * area2;
    ret.y += (p[n-1].y + p[0].y) / 3 * area2;
    area += area2;
    ret.x /= area;
    ret.y /= area;
    return ret;
}

void read(){
    for(int i = 0; i < n; i++) scanf("%lf%lf", &v[i].x, &v[i].y);
}

void solve(){
    Point ret = barycenter(v, n);
    printf("Stage #%d: %.6f %.6f\n", kase++, ret.x, ret.y);
}

int main()
{
    while(scanf("%d", &n) == 1 && n){
        read();
        solve();
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值