您的位置:首页 > 其它

G题 hdu 1466 计算直线的交点数

2015-07-05 20:59 176 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466

计算直线的交点数

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


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

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

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

[align=left]Sample Input[/align]

2

3

[align=left]Sample Output[/align]

0 1
0 2 3

[align=left]Author[/align]
lcy

[align=left]Source[/align]
ACM暑期集训队练习赛(九)

题目大意:计算直线的交点数,注意考虑平行的问题,最后输出所有可能的交点个数。

解题思路:这里采用dp的方法。代码中有详解。

详见代码。

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

using namespace std;

long long a[21][200]; //a[i][j]表示i条直线有j个交点,因为20条直线最多有C(20,2)=190条直线
//开200数组就够,下面循环也是一样。

int main ()
{
memset(a, 0, sizeof(0));
for (int i=1; i<=20; i++)
{
a[i][0] = 1;
for (int j=1; j<=i; j++)        //i条直线中有j条非平行线,则有i-j条非平行线。
{
for (int k=0; k<=190; k++)  //遍历0-190,若j条线有k个交点成立,则在加上i-j条平行线就有i条线(i-j)*j+k个交点成立
{
if (a[j][k])
a[i][(i-j)*j+k] = 1;
}
}
}
int n;
while (scanf ("%d",&n)==1)
{
printf ("0");
for (int i=1; i<=190; i++)
if (a
[i])
printf (" %d",i);
printf ("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: