UVaOj How many pieces of land?

你有一块椭圆的地。你可以在边界上选n个点,并两两连接得到n*(n-1)/2条线段。它们最多能把土地分成多少个部分?
    样例输入:4
    样例输出:8

欧拉公式:V-E+F=2(V代表顶点数,E代表线段数,F代表面数,包含椭圆外的无穷大面),面数最多的情况是任意3条线段不会交于同一点。

下面最重要的就是求出图中的顶点数目,线段数目,进而得到土地的块数。方法:

对图中线段遍历(将线段看做有向线段,例如,线段AB与线段BA不同)。每条线段将其他顶点分成两部分,一边i个顶点,另一边n-i-2个顶点。如此,则该线段被分成了i(n-i-2)+1段,且线段上(不包含断点)有i(n-i-2)个交点。PS:每个交点被重复计算了4次,每条线段被重复计算了2次。

代码如下:

#include <iostream>
using namespace std;

int main()
{
    int n;
    cin>>n;
    int v=0;
    int e=0;
    for(int i=0;i<=n-2;i++)
    {
        v=v+i*(n-2-i);
        e=e+(i*(n-2-i)+1);
    }
    v=n+n*v/4;
    e=n+n*e/2;
    int f=e-v+1;
    cout<<f<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值