zoukankan      html  css  js  c++  java
  • 算法竞赛模板 折线分割平面

    ①求n条“V”型折线所能分割的最大平面数:

    (1) 当增加第n条直线时,为了使平面最多,则第n条直线要与前面2*(n-1)条直线都相交,且没有任何三条直线相交于一点。

    (2) 作图可知,每作出一条符合条件的直线,就会有[2*(n-1)+1]个新平面生成,所以两条平行直线就会新生成2*[2*(n-1)+1]个平面。

    (3) 但由于是通过折线分割,所以两条平行直线会交于一点,在新生成的平面中会有2个平面合成1个平面,则第n条折线新增加的平面数为2*[2*(n-1)+1]-1=4*n-3;

    图示:

    #include<bits/stdc++.h>
    #define MAX 10005
    using namespace std;
    int main()
    {
        int a[MAX],n,i;
        a[1]=2;
        for(i=2;i<=MAX;i++)
            a[i]=a[i-1]+4*i-3;
        while(cin>>n)
            cout<<a[n]<<endl;
        return 0;
    }

    ②求n条“Z”型折线所能分割的最大平面数:

    (1) 当增加第n条直线时,为了使平面最多,则第n条直线要与前面3*(n-1)条直线都相交,且没有任何三条直线相交于一点。

    (2) 作图可知,每作出一条符合条件的直线,就会有[3*(n-1)+1]个新平面生成,所以三条平行直线就会新生成3*[3*(n-1)+1]个平面。

    (3) 又由于是“Z”型折线,共出现了2次折线,每一个折线都会使2个平面合成1个平面,所以在原来的基础上要-2,则第n条直线新增加的平面数为3*[3*(n-1)+1]-2=9*n-8;

    图示:

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int i,n,a[10001];
        a[1]=2;
        for(i=2;i<=10000;i++)
            a[i]=a[i-1]+9*i-8;
            
        while(cin>>n)
        {
            printf("%d
    ",a[n]);
        }
        return 0;
    }
  • 相关阅读:
    性能分析之路-------各指标代表意思以及分析
    selenium python 定位一组对象
    python 操作word文档
    nmon的安装以及使用
    nginx的监控配置
    selenium 一个简单的流程
    Fiddler手机抓包设置
    urllib、urllib2、urllib3区别和使用
    mysql数据库改名的方法
    Python之pymysql
  • 原文地址:https://www.cnblogs.com/kannyi/p/9038565.html
Copyright © 2011-2022 走看看