关于欧拉公式在ACM中的应用

24 篇文章 0 订阅
24 篇文章 0 订阅
题目描述:你有一块椭圆的地,你可以在边界上选n个点,并两两连接得到n(n-1)/2条线段。他们最多能把土地分成多少个部分?

输入:输入包含多组测试数据,每组测试数据占一行,代表在椭圆边界选择点的数量n(n>=2)。

输出:输出为多行,每组输出占一行,对于每组测试数据,输出最多能把土地分成区域的数量。

样例输入:2
                  4
                  6

样例输出:2
                  8
                  31

提示:欧拉公式。

对于本题,利用欧拉公式求解。
在平面欧里几何中,欧拉公式简写成:V-E+F=2,其中V为平面中顶点的数量(包含顶点和所有交点),E为平面中边的数量(包含所有的线段或线段弧),F为平面中所分区域的总数量(包含图形中被分的和外侧中无限大的平面)。

在本题中,我们不考虑外侧的无限平面,那么即得:V-E+F=1,换句话说,只要知道V和E的值,我们就可以求出F=E-V+1。

问题转化为求E和V的值。
为了求出E和V的值,我们不得不对椭圆上的点进行枚举。实际上只要我们任意找两个定点,这条线段就定了。而对于每条线段,两侧其他点的分布方式是不一样的。所以实际上枚举的是所选线段的左侧有的点数,记为i,那么右侧一定有n-i-2个点。对于两侧每两个点都有且仅有唯一的一条线段与之对应,切都会与所选线段交于一点。由于题目中求最优解,故任意三条线段交于一点的情况不考虑。这样共可形成 i*(n-i-2)个交点,在所选线段上也会形成i*(n-i-2)个交点,而这些点将这条线段分成i*(n-i-2)+1条线段。这样枚举每个点都可能是固定的定点,所以最后结果要乘以n,而每个点也被枚举了2次,每次都会将两侧的点枚举两次,故最终结果应该是实际的4倍,故E的结果应除以2,V的结果应除以4。

所以可以得出如下结论
V=n + n/4 * SUM (i*(n-2-i))(0<=i<=n-2)
E=n + n/2 * SUM (i*(n-2-i)+1) (0<=i<=n-2)

这样可以得到以下代码:
#include <iostream>
#include <cstdio>

int main()
{
         int i,n,s=0;
         while(scanf("%d",&n)!=EOF)
         {
                 s=0;
                 for(i=0;i<n-1;i++)
                {
                         s+=2*(i*(n-2-i)+1);
                         s-=i*(n-2-i);
                 }
         printf("%d\n",s*n/4+1);
         }
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值