你有一块椭圆的地。你可以在边界上选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;
}