zoukankan      html  css  js  c++  java
  • HDOJ 1466

    计算直线的交点数

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


    Problem Description
    平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。
    比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。
     
    Input
    输入数据包含多个测试实例,每个测试实例占一行,每行包含一个正整数n(n<=20),n表示直线的数量.
     
    Output
    每个测试实例对应一行输出,从小到大列出所有相交方案,其中每个数为可能的交点数,每行的整数之间用一个空格隔开。
     
    Sample Input
    2 3
     
    Sample Output
    0 1 0 2 3
    这道题没啥说的,直接套用模板,杭电的哥们貌似都是这样的
    
    
     m条直线的交点方案数
    = (m-r)条平行线与r条直线交叉的交点数 + r条直线本身的交点方案
    = (m-r)*r + r条之间本身的交点方案数
    
        即p[j][k]→p[i][(i-j)*j+k],或者便于理解的形式:p[m+△x][n]→p[m+△x][m*△x+n],其中△x是增加的平行直线数,它们会和原来的m条直线交出m*△x个新交点,再加上原本的n个交点即可。虽然是二维数组,但存在三个变量,故处理时是三重for循环。
    
    
    
    
    
    #include <iostream>
    using namespace std;
    bool p[21][191];
    void init()
    {
        int i, j, k;
        for( i=1; i<21; i++ )
            p[i][0] = true;
        for( i=2; i<21; i++ )
            for( j=1; j<=i; j++ )
                for( k=0; k<191; k++ )
                    if( p[j][k] )
                        p[i][(i-j)*j+k] = true;
    }
     int main()
    {
        init();
        int i, n, t;
        while( cin >> n )
        {
            t = (n*(n-1))/2;
            for( i=0; i<t; i++ )
                if( p[n][i] )
                    cout << i << " ";
            cout << t << endl;
        }
        return 0;
    }
    
  • 相关阅读:
    计蒜客 跳跃游戏2
    计蒜客 跳跃游戏
    2018 计蒜之道-初赛 第一场 A-百度无人车
    poj 3625 (最小生成树算法)
    poj 3623(贪心)
    poj2386(dfs搜索水题)
    poj 2761 主席树的应用(查询区间第k小值)
    POJ 2456 编程技巧之------二分查找思想的巧妙应用
    POJ 1995(有关快速幂运算的一道水题)
    1441:【例题2】生日蛋糕
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2572374.html
Copyright © 2011-2022 走看看