Question:
Result:1391
Solve:
看到这个题,首先会发现是无法用程序去模拟分割的,所以肯定有一定的规律~
规律都是由小到大得出来的,所以我们先从一条直线看起:
如果只有直线
要想构造的分割块最多,那么新添加的直线就要与之前所有的直线相交,而且不能经过之前的直线所形成的交点
就像这样:
至于规律:
平面上有 0 条直线,有 1 个部分。
平面上有 1 条直线,可以划分出 1+1 个部分
平面上有 2 条直线,可以划分出 1+1+2 个部分
平面上有 3 条直线,可以划分出 1+1+2+3 个部分
然后就不难想到平面上有 n 条直线时,其可划分出的部分最多为
z(n) = n × (n + 1) / 2 + 1
那如果加上圆呢?
首先必须记住一点,这个圆的大小是任意的,这也是直线和圆能分开考虑的关键
作图的话:
打个表找一下规律:
可以看到
f(n , m) = f(n, m - 1) + 2 * (n + m - 1)
[ f(n, m) 表示n条直线,m个圆时的分割块个数 ]
只要看出这个,这道题就解决了
最后提一下,对于规律题,最好的办法就是打表造出前面的结果,然后去推规律~~~
Code:
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
//单直线
int num = 20*21/2 + 1;
//加圆
for(int i = 1; i <= 20; i++){
num += 2 * (i + 20 - 1);
}
cout <<num;
return 0;
}
最后附上蓝桥杯汇总链接:蓝桥杯C/C++A组省赛历年真题题解
声明:图片均来源于蓝桥杯官网,以个人刷题整理为目的,如若侵权,请联系删除~