AcDream 1080 面面数 递推Or待定系数法

题意:问最少多少个过同一点的平面能够将空间分成N份。

解法:这题的基本思路肯定是求出x个平面最多能够划分出多少个子空间,然后二分枚举出答案。小涛神说了一种非常神的方法来解这一题,那就是得到三组最简单的解,假设最后的通项公式是一个最高次为1次的表达式,那么采用待定系数法用两组数据得到表达式然后使用第三组检验前两组得出的解。如果不相符的话那么再推出一个解,假设通项公式最高次为2次解方程...最后就能够得到这题的通项公式:f(x) = x*x - x + 2。

  当然,我是想使用递推公式来解决这一问题,由于三个平面最多将空间分成8份,而在增加一个平面的话,由于所有平面都要过一个点,那么三个平面就已经确定那一个交点,垂直于一个平面对空间结构进行投影,那么平面上将出现两条直线相交的情况,那么第四个平面同样也会这这个平面上投影出一条直线,那么这条直线最多分割3*2个空间,乘以2是因为投影的下面同样能够被分割。因此递推公式为:f[i] = f[i-1] + (i-1) * 2

代码如下:

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

int f[50005];
const int lim = 44723;

void pre() {
    f[0] = 1, f[1] = 2;
    int i;
    for (i = 2; f[i-1] < 2000000000; ++i) {
        f[i] = f[i-1] + 2 * (i-1);
    } // 44723
}

int main() {
    pre();
    int T, x;
    scanf("%d", &T);
    while (T--) {
        scanf("%d", &x);
        if (x == 0) {
            puts("1");
            continue;
        }
        printf("%d\n", lower_bound(f, f+lim, x) - f);
    }
    return 0;
}

 

你可能感兴趣的:(cd)