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 }

 

posted @ 2018-11-28 21:13  suvvm  阅读(234)  评论(0编辑  收藏  举报