HDOJ 2050 折线分割平面
我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。
Input输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0<n<=10000),表示折线的数量。
Output对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。
Sample Input
2 1 2
Sample Output
2 7
解题思路:
本题给出测试数量c,每组测试给出一个数字n为折线的数量。要求计算出平面的最大分割数。
我们先不管折线,我们分析一下2n条直线可以将可以将平面分为多少份
直线数量:0 分割数量:1 直线数量:1 分割数量:1 + 1 = 2 直线数量:2 分割数量:2 + 2 = 4 直线数量:3 分割数量:4 + 3 = 7 直线数量:4 分割数量:7 + 4 = 11 直线数量:5 分割数量:11 + 5 = 16 直线数量:6 分割数量:16 + 6 = 22 …… 直线数量:n 分割数量:1 + 1 + 2 + 3 + 4 + …… + n
现在在看一下折线
一条折线可以看作2条直线,现在再看这个图仿佛变了些什么
每捏起一个点便会少分割两个平面,而一条折线相当与两条直线捏起一个点。
直线数量:0 分割数量:1 直线数量:1 分割数量:1 + 1 = 2 直线数量:2 分割数量:2 + 2 = 4 斜线数量:1 分割数量:2 = 4 - 2 直线数量:3 分割数量:4 + 3 = 7 直线数量:4 分割数量:7 + 4 = 11 斜线数量:2 分割数量:7 = 11 - 4 直线数量:5 分割数量:11 + 5 = 16 直线数量:6 分割数量:16 + 6 = 22 斜线数量:3 分割数量:16 = 22 - 6 …… 直线数量:2n 分割数量:1 + 1 + 2 + …… + 2n 斜线数量:n 分割数量:1 + 1 + 2 + …… + 2n - 1 找到了规律,获得了巨大的快乐
这样求n条折线分割平面数量就转化为了求2n - 1条直线分割平面数量
而且n最大为1e4而且有多组数据,这当然要快乐打表。
AC代码
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1e4+10; 4 int temp[2 * maxn + 100]; //temp[i]记录i条直线最大分割平面数 5 int ans[maxn + 10]; //ans[i]记录i条折线最大分割平面数 6 void init(){ 7 ans[1] = 2; 8 temp[1] = 2; 9 int cnt = 1; //cnt记录直线数量 10 for(int i = 2; i < 2 * maxn; i++){ //直线数量1~2 * maxn 11 temp[i] = temp[i - 1] + i; 12 if(i % 2 == 0 && i > 2){ //每当i为2的倍数时记录折线答案 13 cnt++; 14 ans[cnt] = temp[i - 1]; 15 } 16 } 17 } 18 int main() 19 { 20 int c; 21 init(); //快乐打表 22 while(scanf("%d", &c) != EOF){ //输入测试数量 23 for(int i = 0; i < c; i++){ 24 int n; 25 scanf("%d", &n); //输入折线数量 26 printf("%d\n", ans[n]); //输出答案 27 } 28 } 29 return 0; 30 }