zoukankan      html  css  js  c++  java
  • HDOJ 1466 计算直线的交点数

    将n 条直线排成一个序列,直线2和直线1最多只有一个交点,直线3和直线1,2最多有两个交点,。。。。。。,直线n 和其他n-1条直线最多有n-1个交点。由此得出n条直线互不平行且无三线共点的最多交点数:
    Max = 1 +2 +。。。。(n-1)=n(n-1)/2;
    但本题不这么简单,这些直线有多少种不同的交点数?
    HDOJ 1466 计算直线的交点数 - qhn999 - 码代码的猿猿
     
    容易列举出i=1,2,3的情况如下图所示,来分析n=4的情况:
    1.       四条直线全部平行,无交点
    2.       其中三条平行,交点数: (n-1)*1 +0=3;
    3.       其中两条平行,而另外两条直线的交点既可能平行也可能相交,因此交点数据分别为:
    (n-2)*2+0=4
       (n-2)*2 +1=5
    4. 四条直线互不平行, 交点数为(n-3)*3+3条直线的相交情况:
    (n-3)*3+0=3 
    (n-3)*3+2=5 
    (n-3)*3+3=6
    即n=4时,有0, 3, 4, 5, 6个不同的交点数.所有有5种可能
    从上述n=4的分析过程中,发现:
    M条直线的交点方案数=(m-r)条平行线与r条直线交叉的交点数+r条直线本身的交点方案=
    (m-r)*r +r条直线之间的交点数。


    计算直线的交点数

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 7031    Accepted Submission(s): 3125


    Problem Description
    平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。
    比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。
     

    Input
    输入数据包含多个测试实例,每个测试实例占一行,每行包含一个正整数n(n<=20),n表示直线的数量.
     

    Output
    每个测试实例对应一行输出,从小到大列出所有相交方案,其中每个数为可能的交点数,每行的整数之间用一个空格隔开。
     

    Sample Input
    2
    3
     

    Sample Output
    0 1
    0 2 3
     

    Author
    lcy
     

    Source
     

    Recommend
    lcy
     

    #include <iostream>
    #include <cstdio>
    #include <cstring>

    using namespace std;

    int n;
    int m[22][222];

    void css()
    {
        memset(m,0,sizeof(m));

        for(int i=1;i<=21;i++)
         m[0]=1;

        for(int i=2;i<=20;i++)
        {
            for(int j=1;j<i;j++)
            {
                int dd=(i-j)*j;
                for(int k=0;k<222;k++)
                {
                    if(m[j][k])
                    {
                        m[dd+k]=1;
                    }
                }
            }
        }

    }

    int main()
    {
        css();
    while(cin>>n)
    {
    /*
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<=20;j++)
                cout<<m[j]<<" ";
            cout<<endl;
        }
    */
        printf("0");
        for(int i=1;i<222;i++)
          if(m[n])
            printf(" %d",i);

        putchar(10);
    }
        return 0;
    }


  • 相关阅读:
    牛客网 二叉树的镜像 JAVA
    牛客网 反转链表 JAVA
    牛客网 调整数组顺序使奇数位于偶数前面 JAVA
    Integer to Roman LeetCode Java
    Valid Number leetcode java
    Longest Common Prefix
    Wildcard Matching leetcode java
    Regular Expression Matching
    Longest Palindromic Substring
    Add Binary LeetCode Java
  • 原文地址:https://www.cnblogs.com/CKboss/p/3351013.html
Copyright © 2011-2022 走看看