蓝桥杯平面分割

题目[P1512 - 蓝桥杯2020初赛] 平面分割 - New Online Judge (ecustacm.cn)

这个题比较难想,最好是结合画图来看

思路:

  • n个圆可以将一个平面分割为多少部分:
    除第一个圆外,每添加一个圆都会将平面额外分割2*(n-1)部分
    f(1) = 2
    f(2) = f(1) + 2 * (n - 1) = 4
    f(3)= 8
    f(n) = f(n - 1) + 2 * (n - 1)
    f(n) = f(n - 2) + 2 * (n - 2) + 2 * (n - 1)
    f(n) = 2 + 2 * 1 + 2 * 2 + … + 2 * (n - 1) = 2 + 2 * (1 + 2 + 3 + … + n - 1)
    = 2 + 2 * ((1 + n - 1) * (n - 1)) / 2
    = 2 + n * (n - 1);

  • m个直线可以将一个平面分割为几部分:
    除第一条直线外,每额外添加一条直线都会将平面额外分割n部分
    h(1) = 2
    h(2) = 4
    h(3) = 7
    h(n) = 2 + 2 + 3 + 4 … + n
    = 1 + (1 + n) * n / 2

  • n个圆和m个直线共可以将平面分为几个部分:
    n个圆0条线:g(n,0)=f(n)= 2 + n * (n - 1);
    n个圆1条线:这条直线可以分割它与所有圆交点个数个部分,每个圆可产生2个交点,也即增多2n个部分
    g(n,1)=2 + n * (n - 1)+2
    n;
    n个圆2条线:第二条线同样可以产生2n个部分,除此之外还将与第一条直线相交分割一个部分
    g(n,2)=g(n,1)+2
    n+2
    g ( n , m ) = 2 + n ∗ ( n − 1 ) + 2 ∗ n ∗ m + ( 2 + m ) ∗ ( m − 1 ) / 2 g(n,m)=2+n*(n-1)+2*n*m+(2+m)*(m-1)/2 g(n,m)=2+n(n1)+2nm+(2+m)(m1)/2

#include
#include
#include
#include//使用to_string必须加该头文件
#include
#include
#include
#include
using namespace std;
#define ll long long 
#define itn int
const int array_size = (int)1e6 + 50;
const int INF = 0x3f3f3f3f;
using namespace std;
/*
n个圆可以将一个平面分割为多少部分:
除第一个圆外,每添加一个圆都会将平面额外分割2*(n-1)部分
f(1) = 2
f(2) = f(1) + 2 * (n - 1) = 4
f(3)= 8
f(n) = f(n - 1) + 2 * (n - 1)
f(n) = f(n - 2) + 2 * (n - 2) + 2 * (n - 1)
f(n) = 2 + 2 * 1 + 2 * 2 + ... + 2 * (n - 1) = 2 + 2 * (1 + 2 + 3 + ... + n - 1)
= 2 + 2 * ((1 + n - 1) * (n - 1)) / 2
= 2 + n * (n - 1);

m个直线可以将一个平面分割为几部分:
除第一条直线外,每额外添加一条直线都会将平面额外分割n部分
h(1) = 2
h(2) = 4
h(3) = 7
h(n) = 2 + 2 + 3 + 4 ... + n
= 1 + (1 + n) * n / 2

n个圆和m个直线共可以将平面分为几个部分:
n个圆0条线:g(n,0)=f(n)= 2 + n * (n - 1);
n个圆1条线:这条直线可以分割它与所有圆交点个数个部分,每个圆可产生2个交点,也即增多2*n个部分
g(n,1)=2 + n * (n - 1)+2*n;
n个圆2条线:第二条线同样可以产生2*n个部分,除此之外还将与第一条直线相交分割一个部分
g(n,2)=g(n,1)+2*n+2
g(n,m)=2+n*(n-1)+2*n*m+(2+m)*(m-1)/2
*/
int main()
{
	int m = 20, n = 20;
	cout << 2 + n * (n - 1) + 2 * n * m + (2 + m) * (m - 1) / 2 << endl;
	return 0;
}

你可能感兴趣的:(c++)