直线交点数

在这里插入图片描述

题解分析:

我们将n条直线编号,分别称为直线1、直线2、…、直线n。直线2 与直线1 最多有一个交点,直线3与直线1和直线2最多有2个交点,……,直线n与其它 (n-1) 条直线最多 (n-1) 个交点。

由此看出,n条无三线共点的直线最多的交点数 max=1+2+…+(n-1)=n(n-1)/2

但本题我们要求解的是:这 n 条直线共有多少种不同的交点数? 仍然从举例出发。下面列举了 n=1、2、3、4 四种情况各自的交点情况:

具体分析一下 n=4 的情况:

1)4 条直线全部平行,则 0 交点 { =4*(4-4)}。

2)其中 3 条直线平行,则 3 交点 { =3*(4-3) }。

3)其中 2 条直线平行,则这2条直线与另2条直线的交点数为4,而另2条直线之间可能有0个或1个交点(见 n=2 的情况,共 4 个交点或 5 个交点。{=2*(4-2)+0 或 1 }

4)4 条直线均不平行(可看成 1 条直线平行),这 1 条直线与其它 3 条直线的交点数为 3,而其 它 3 条直线之间的交点数为 3,共 6 个交点。{ =1*(4-1)+3 }

经过以上分析,我们可以得如下结论:

m 条直线的交点方案=r 条平行线与(m-r)条直线交叉的交点数+(m-r)条直线本身的交点方案
=r
(m-r)+(m-r)条直线本身的交点方案 (1<=r<=m)
*

在具体编程时,我们设置一个标志数组 f[0…max],在使用上述结论递归求解的过程中,每得到一种交点数 k,则置 f[k]为 true(初始 f[0]~f[max]均为 false)。

#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
#define ll long long
//欧拉函数的求值 
int n,MAX=-1,ans=0;
bool f[11000];
void g(int n,int k)//n代表平行的线 ,k代表当前的交点个数 
{
	if(n==0)
	{
		f[k]=true;
		MAX=max(MAX,k) ;
	}
	else
	{
		for(int i=n;i>=1;i--)
		{
			g(n-i,i*(n-i)+k);
		}
	}
}

int main()
{
	cin>>n;
	g(n,0);
	for(int i=0;i<=MAX;i++)
	{
		if(f[i]) ans++;
	}
	cout<<ans;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值