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 }
  • 相关阅读:
    网络编程
    正则表达式
    对空气质量历史数据的爬取
    通过移动设备行为数据预测性别年龄
    电影口碑与海报图像的相关性分析
    微博情感分析
    《python3网络爬虫开发实战》--验证码的识别
    python编程快速上手
    Echarts树图定制详解
    Servlet学习笔记【2】---Http数据包
  • 原文地址:https://www.cnblogs.com/suvvm/p/10034683.html
Copyright © 2011-2022 走看看