zoukankan      html  css  js  c++  java
  • 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
    ", ans[n]); //输出答案
    27         }
    28     }
    29     return 0;
    30 }
  • 相关阅读:
    移动 App 接入 QQ 登录/分享 图文教程
    Word 最后一页无法删除-解决办法
    Java快速入门-04-Java.util包简单总结
    Java快速入门-03-小知识汇总篇(全)
    SSM 框架-06-详细整合教程(IDEA版)(Spring+SpringMVC+MyBatis)
    二叉树的镜像
    浅析I/O模型及其设计模式
    远程方法调用(RMI)原理与示例
    树的子结构
    合并两个排序的链表
  • 原文地址:https://www.cnblogs.com/suvvm/p/10034683.html
Copyright © 2011-2022 走看看