• max of 直线划平面


    在一个无限延伸平面上有一个圆和n条直线,这些直线中每一条都在一个圆内,并且同其他所有的直线相交,假设没有3条直线相交于一点,试问这些直线最多将圆分成多少区域。
    第一行包含一个整数T,(0< T<=100)表示测试次数。
    每组测试数据包含一个整数N(0<=N<=10000000),表示直线的条数。
    对于每一组测试数据,输出这个圆能被这N条直线分成的最多区域数。

    sample Input

    2
    1
    2

    sample Output

    2
    4
     
     
    详细解答:

    问题描述:

         n条直线最多能划分出多少个平面?

    问题分析:

         平面上只要多出现一条直线,就能至少多把平面分出一部分,而若此直线与其他直线有n个交点,就再能把平面多分出n个部分,因此若想把平面划分的部分最多,新添入的直线必须与前k条直线交k个点,即第二条直线要与第一条直线交1个点,第三条要与前两条交2个点,……,第1999条与前1998条交1998个点,这样,第二条直线多划分出1+1=2个部分,第三条直线多划分出1+2=3个部分,……,第1999条直线多划分出1+1998=1999个部分。而第一条直线把平面划分出2个部分,因此1999条直线能划分平面的块数为:
    2+2+3+4+5+…+1998+1999  = 1+(1+2+3+4+5+…+1998+1999)  = 1+(1+1999)*1999/2  = 1999001

         对n条直线最多划分平面数:

        (1)使用递归

             f(n) = n + f(n-1) ,   n > 1     

             f(n) = 2               ,   n = 1

        (2)使用递推

             n = 1,  S1 = 2       

             n > 1,  Sn = 2 + 2 + 3 + …… + n  = 1 + n * (n+1) / 2

    #include<stdio.h>
    int main()
    {
        int t;
        long long n;
        long long sum;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%lld",&n);//64bit防溢出
            sum=1+n*(n+1)/2;//递推公式使用
            printf("%lld
    ",sum);
        }
        return 0;
    }
  • 相关阅读:
    Flask上下文管理源码分析 ——(3)
    Flask 快速使用 进阶—— (2)
    HTML-语法
    安装kubenetes-遇到的问题总结
    CentOS7-部署kubernetes
    k8s-部署及介绍
    docker-macvlan网络
    Dom编程-左侧菜单栏设计模型实现
    JavaScript-checkbox标签-隐藏、显示、全选、取消和反选等操作
    docker-Overlay原生网络
  • 原文地址:https://www.cnblogs.com/gti2baby/p/10456432.html
Copyright © 2020-2023  润新知