首页 > 其他分享 >洛谷题单指南-数学基础问题-P2789 直线交点数

洛谷题单指南-数学基础问题-P2789 直线交点数

时间:2024-04-08 16:34:19浏览次数:30  
标签:剩余 直线 洛谷题 平行 当有 交点 P2789 条线

原题链接:https://www.luogu.com.cn/problem/P2789

题意解读:n条直线可以形成不同交点数的方案数。

解题思路:

对于n = 1、2、3、4的情况进行模拟:

n = 1时,有1种不同的交点数

n = 2时,有2种不同的交点数

n = 3时,有3种不同的交点数

n = 4时,有5种不同的交点数

对n = 4的情况,分情况讨论:

如果有4条直线平行,交点数:平行线数 * 剩余线数 = 4 * (4 - 4) = 0

如果有3条直线平行,剩余1条直线与3条平行线的交点数:平行线数 * 剩余线数 = 3 * (4 - 3) = 3

如果有2条直线平行,剩余2条直线与2条平行线的交点数:平行线数 * 剩余线数 = 2 * (4 - 2) = 2,剩余2条直线之间的交点数可能是0或者1,回到了2的情况

如果有1条直线平行(所有4条都不平行),剩余3条直线与1条平行线的交点数:平行线数 * 剩余线数 = 1 * (4 - 1) = 3

核心思路是枚举不同直线条数下可以形成多少种交点数,

设f(n, x)表示剩余n条直线,累计已有x个交点

仍以n = 4为例来演示如何枚举

- f(4, 0)表示剩余4条直线,已有0个交点

- 当有1条直线平行,剩下3条直线与之产生1 * (4-1) = 3个交点,表示为f(3, 3 + 0)

  - 对f(3, 3)继续处理

  - 当有1条直线平行,剩下2条直线与之产生1 * (3-1) = 2个交点,表示为f(2, 2 + 3)

    - 对f(2, 5)继续处理

    - 当有1条直线平行,剩余1条直线与之产生1 * (2-1) = 1个交点,表示为f(1, 1 + 5)

      - 对f(1, 6)继续处理

      - 当有1条直线平行,剩余0条直线与之产生1 * (1 - 1) = 0个交点,表示为f(0, 0 + 6)

    - 当有2条直线平行,剩余0条直线与之产生2 * (2-2) = 0个交点,表示为f(0, 0 + 5)

  - 当有2条直线平行,剩下1条直线与之产生2 * (3-2) = 2个交点,表示为f(1, 2 + 3)

    - 对f(1, 5)继续处理

    - 当有1条直线平行,剩余0条直线与之产生1 * (1 - 1) = 0个交点,表示为f(0, 0 + 5)

  - 当有3条直线平行,剩余0条直线与之产生3 * (3-3) = 0个交点,表示为f(0, 0 + 3)

- 当有2条直线平行,剩余2条直线与之产生2 * (4-2) = 2个交点,表示为f(2, 2 + 0)

  - 对f(2, 2)继续处理

  - 当有1条直线平行,剩余1条直线与之产生1 * (2-1) = 1个交点,表示为f(1, 1 + 2)

    - 对f(1, 3)继续处理

    - 当有1条直线平行,剩余0条直线与之产生1 * (1-1) = 0个交点,表示为f(0, 0 + 3)

  - 当有2条直线平行,剩余0条直线与之产生2 * (2-2) = 0个交点,表示为f(0, 0 + 2)

- 当有3条直线平行,剩余1条直线与之产生3 * (4-3) = 3个交点,表示为f(1, 3 + 0)

- 当有4条直线平行,剩余0条直线与之产生0 * (4 - 4) = 0个交点,表示为f(0, 0 + 0)

可以看出,对于f(n, x)的处理是一个递归的过程,当n == 0的时候,x的值就是一个可能的交点数,有可能重复,通过hash进行记录即可,最后统计不同交点数的个数。

hash数组的大小开多大?也就是最多有多少个交点?

以n条直线为例,

第1条线开始,最多有0个交点

第2条线与前1条线最多有1个交点

第3条线与前2条线最多有2个交点

第n条线与前n-1条线最多有n-1个交点

因此,总交点数最多有0+1+2+......+n-1 = n * (n-1) / 2

n最多是25,交点数最多25*24/2 = 300。

100分代码:

#include <bits/stdc++.h>
using namespace std;

int n, ans;
bool h[500];

//剩余n条直线,累计已有x个交点
void f(int n, int x)
{
    if(n == 0) h[x] = true;
    for(int i = 1; i <= n; i++) //枚举i条直线平行的情况
    {
        f(n - i, i * (n - i) + x); //当有i条直线平行,考虑剩余n - i条直线,累计已有i * (n - i) + x个交点的情况
    }
}

int main()
{
    cin >> n;
    f(n, 0);
    for(int i = 0; i <= 500; i++)
    {
        if(h[i]) ans++;
    }
    cout << ans;
    return 0;
}

 

标签:剩余,直线,洛谷题,平行,当有,交点,P2789,条线
From: https://www.cnblogs.com/jcwy/p/18121631

相关文章

  • 洛谷题单指南-数学基础问题-P1866 编号
    原题链接:https://www.luogu.com.cn/problem/P1866题意解读:N个整数M1~Mn,对每个整数Mi,选取1~Mi之间的一个数,使得N个数都不一样的选法。解题思路:将M1~Mn由小到大排序,第1个的选法有M1种第2个的选法有M2-1种第3个的选法有M3-2种......第n个选法有Mn-n+1种全部相乘取模即可。......
  • 洛谷题单指南-数学基础问题-P1017 [NOIP2000 提高组] 进制转换
    原题链接:https://www.luogu.com.cn/problem/P1017题意解读:负进制数的转换。解题思路:下面给出两种思路1、枚举法从数据范围来看,∣n∣≤37336,因此,可以对该r进制的数进行枚举,每一次枚举,都计算r进制数对应的十进制数是否和n相等,相等则输出该r进制数。主要问题就是要解决r进制......
  • 洛谷题单指南-数学基础问题-P1100 高低位交换
    原题链接:https://www.luogu.com.cn/problem/P1100题意解读:将32位二进制数的高低16位交换位置。解题思路:给定无符号整数a,假设二进制高16为h,低16位为l,即a表示为hl,a>>16得到0h,a<<16得到l0,两者相加即得到lh,交换完毕。需要注意的是,无符号整数的表示是unsignedint,如果是int,......
  • 洛谷题单指南-数学基础问题-P1469 找筷子
    原题链接:https://www.luogu.com.cn/problem/P1469题意解读:找到落单的整数,其他整数都可以配对。解题思路:利用异或的特性:1、整数和自己异或x^x=02、任何数和0异或x^0=x因此,将所有数异或起来,结果就是落单的整数。100分代码:#include<bits/stdc++.h>usingnamespa......
  • 洛谷题单指南-数学基础问题-P1143 进制转换
    原题链接:https://www.luogu.com.cn/problem/P1143题意解读:进制转换的模版题,n进制转10进制,10进制转m进制。解题思路:1、对于n进制数转10进制,如abcd转10进制,根据定义是a*n^3+b*n^2+c*n+d,在程序中迭代处理:for(inti=0;i<s.length();i++)dec=dec*n+s[i]需要注......
  • 洛谷题单指南-图的基本应用-P1983 [NOIP2013 普及组] 车站分级
    原题链接:https://www.luogu.com.cn/problem/P1983题意解读:由于“如果这趟车次停靠了火车站x,则始发站、终点站之间所有级别大于等于火车站x的都必须停靠”。因此,在始发站和终点站之间,能停靠的车站都是级别较高的,没有停靠的车站都是级别较低的,计算最少有多少个不同级别。解题思路:......
  • 洛谷题单指南-图的基本应用-P1347 排序
    原题链接:https://www.luogu.com.cn/problem/P1347题意解读:在给出多对关系字母的比较关系之后,判断能否确定所有字母的顺序。解题思路:对字母的关系建立图,如A<B建立A指向B的一条边。如果在拓扑排序过程中,每次寻找入度为0的点只有一个,且最终可以形成拓扑序,则可以确定所有字母的顺......
  • 洛谷题单指南-图的基本应用-P1363 幻象迷宫
    原题链接:题意解读:迷宫可以无限扩展,对第一个样例进行模拟,扩展4块的示意图:从起点S,沿着红色虚线,是可以无限走下去的,要判断是否能够无限走下去。解题思路:直观上,会考虑把迷宫复制多块,但是会面临2个问题:1、内存可能爆掉2、如何有效判断可以无限走下去?只考虑竖向或者横向连通是不......
  • 洛谷题单指南-图的基本应用-P2853 [USACO06DEC] Cow Picnic S
    原题链接:https://www.luogu.com.cn/problem/P2853题意解读:找到所有奶牛都可以到达的牧场,就是要从奶牛所在位置开始遍历,求所有奶牛能重合的点的个数。解题思路:直接从从牛奶所在位置进行DFS,记录每个位置有奶牛能到的个数,个数等于奶牛总数的即合适的牧场。100分代码:#include<bi......
  • 洛谷题单指南-图的基本应用-P1127 词链
    原题链接:https://www.luogu.com.cn/problem/P1127题意解读:按字典序排列单词,使得相邻单词的首位字母一样。解题思路:由于单词之间可以相邻的条件是前一个单词的末尾字母和后一个单词的开头字母一样,因此可以遍历每一个单词,再找到每一个可以接在其后面的单词,建立一个邻接表,然后从......