codeup26697 直线平面分割
时空限制 1000ms/128MB
题目描述
同一平面有n(n<=500)条直线,已知其中p(p>=2)条直线相交于同一个点,则这n条直线最多能将平面分割成多少个不同的区域?
输入
两个整数n(n<=500)和p(2<=p<=n)。
输出
一个正整数,代表最多的分割成的区域数目。
样例输入
12 5
样例输出
73
分析
先看一个题目:n条直线最多分平面问题
题目大致如:n条直线,最多可以把平面分为多少个区域。
当有n-1条直线时,平面最多被分成了f(n-1)个区域。则第n条直线要是切成的区域数最多,就必须与每条直线相交且不能有同一交点。 这样就会得到n-1个交点。这些交点将第n条直线分为2条射线和n-2条线断。而每条射线和线断将以有的区域一分为二。这样就多出了2+(n-2)个区域。
故:f(n)=f(n-1)+n // 递推公式
=f(n-2)+(n-1)+n
……
=f(1)+2+……+n // f(1)=2
=2+2+3+...+n
=1+1+2+3+...+n
=n(n+1)/2+1 // 递推公式
本题先是p条直线相交一点,共分割平面2*p个区域。
代码
#include<iostream>
using namespace std;
const int N = 505;
int a[N];
int main(){
int n,p;
cin>>n>>p;
a[p]=2*p; //for (int i=2; i<=p; i++) a[i]=a[i-1]+2;
for (int i=p+1; i<=n; i++)
a[i]=a[i-1]+i;
cout<<a[n]<<endl;
return 0;
}