C/C++ 求凸多边形对角线交点个数(洛谷原创题)

 

注:看了一眼大家的解答,大概都是组合排列或是数学几何方法推导从而解答,这里提供一个比较单调的解题方法。

解题思路:

这里我打了一个表

n 交点

2 = 0

3 = 0

4 = 1

5 = 5

6 = 15

7 = 35

8 = 70

... ...

对数列每相邻两项作差

得到

  1. a[3]-a[2] = 0

  2. a[4]-a[3] = 1

  3. a[5]-a[4] = 4

  4. a[6]-a[5] = 10

  5. a[7]-a[6] = 20

  6. a[8]-a[7] = 35

而后再做差得到

1

3

6

10

15

然后再做差——此时规律已经浮出水面啦!

1

2

3

4

5

...

所以,类似的这种题都可以坚持不懈做差找规律...

根据以上思路代码如下

C++:

#include<iostream>
using namespace std;
long long a[1000], a1[1000], a2[1000], a3[1000];
int main() {
	long long N;
	cin >> N;
	for (int i = 1; i <= N - 3; i++)
		a1[i] = i;
	for (int i = 2; i <= N - 2; i++)
		for (int j = 1; j <= i - 1; j++)
			a2[i] += a1[j];
	for (int i = 3; i <= N - 1; i++)
		for (int j = 1; j <= i - 1; j++)
			a3[i] += a2[j];
	for (int i = 4; i <= N; i++)
		for (int j = 1; j <= i - 1; j++)
			a[i] += a3[j];
	cout << a[N];
	return 0;
}

C: 

#include<cstdio>
long long a1[1000];
long long a2[1000];
long long a3[1000];
int main()
{
	long long n;
	scanf("%lld",&n);
	int t=0;
	for(int i=1;i<=n;i++)
	{
		a1[i]=a1[i-1]+i;//这里生成1,3,6,10序列
	}
	for(int i=1;i<=n;i++)
	{
		a2[i]=a2[i-1]+a1[i];//这里生成1,4,10,20序列
	}
	for(int i=1;i<=n;i++)
	{
		a3[i]=a3[i-1]+a2[i];//这里生成答案序列:1,5,15,35
	}
	printf("%lld",a3[n-3]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_73842814/article/details/127746743