(贪心)折线分割平面

来源:互联网 发布:spark教程python版本 编辑:程序博客网 时间:2024/05/17 07:03
我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。

Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0<n<=10000),表示折线的数量。

Output
对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。

Sample Input
212
Sample Output
2这道题一开始没有思路,看了其他的博客,用贪心策略

今天这道贪心题分为以下几个步骤,

1.首先我们想一下直线的情况,

按贪心策略,要想得到最多的平面,则新加入的一条边N,要与之前的N-1条边都相交产生两两相交的交点(没有任意三条相交于一点)。

则第N条直线最多就有N-1个交点,

然后由于每增加N个点,增加N+1个平面

则n条直线最多将平面分割成1+1+2+...+n=1+n*(n+1)/2 部分

2.然后我们看每增加两条相互平行的直线。

当第N次添加时,前面已经有2N-2条直线了,所以第N次添加时,第2N-1条直线和第2N条直线都各能增加2*N-1平面,所以一共增加了4N-2个平面。

然后计算一下

sum=1-2*n+4(1+2+...+n)=2*n*(n+1)-2n+1=2*n*n+1;

3.最后我们看每次让新增加的变为折线

变为折线后,每次增加,都少产生一个平面,

然后就是总共少产生了N个平面。

故结果变为2*n*n-n+1




#include<cstdio>#include<iostream>using namespace std;int main(){    int n;    long long a;    cin>>n;    while(n--)    {        cin>>a;        printf("%lld\n",2*a*a-a+1);    }}


0 0