hdu 1466 计算直线交点数
2017-03-15 17:38
302 查看
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466
解题思路:
定义一个数组a[21][200],21表示最多有20条直线,200表示交点的最多个数
直线交点的最多个数很简单,就是n*(n-1)/2,20条直线最多交点数为190
当a[i][j]=1时,表示i条直线存在有j个交点的情况
当目前有n条直线时
1.有n-1条直线平行,1条不平行,有n-1个交点,且1条直线自身无交点
2.有n-2条直线平行,2条不平行,2条直线自身有0或1个交点,交点数为
[0]或a
[1]
3.有n-i条直线平行,i条不平行,i条直线自身的交点情况为a[i][j](j从1到200遍历)
交点数为
由上可知,当a[i][j]=1即j条直线存在j个交点时,
n条直线中有i条直线不平行且有
故对a
[(n-i)*i+j]赋值1
因此可设计一个三重循环,第一重为直线,第二重为不平行的直线条数,第三重为交点个数,通过判定条件确定交点是否存在
编程时应设立初值,即直线全部平行,交点为0的情况
解题思路:
定义一个数组a[21][200],21表示最多有20条直线,200表示交点的最多个数
直线交点的最多个数很简单,就是n*(n-1)/2,20条直线最多交点数为190
当a[i][j]=1时,表示i条直线存在有j个交点的情况
当目前有n条直线时
1.有n-1条直线平行,1条不平行,有n-1个交点,且1条直线自身无交点
2.有n-2条直线平行,2条不平行,2条直线自身有0或1个交点,交点数为
(n-2)*2+0或
(n-2)*2+1即a
[0]或a
[1]
3.有n-i条直线平行,i条不平行,i条直线自身的交点情况为a[i][j](j从1到200遍历)
交点数为
(n-i)*i+j,即转化为求解这i条直线自身的交点情况
由上可知,当a[i][j]=1即j条直线存在j个交点时,
n条直线中有i条直线不平行且有
(n-i)*i+j个交点的情况也存在中
故对a
[(n-i)*i+j]赋值1
因此可设计一个三重循环,第一重为直线,第二重为不平行的直线条数,第三重为交点个数,通过判定条件确定交点是否存在
编程时应设立初值,即直线全部平行,交点为0的情况
#include <stdio.h> #include <math.h> int main() { int n,i,j,k,a[21][201]={0}; a[0][0] = 1; a[1][0] = 1; for (i=2;i<21;i++) {//共有i条直线 a[i][0] = 1;//一定会出现直线全部平行,交点为0的情况 for (j=1;j<i;j++) //从中取j条不与第n条直线平行的直线 for (k=0;k<=200;k++) //j条直线的交点情况 if(a[j][k]) a[i][(i-j)*j+k]=1; } while(scanf("%d",&n)!=EOF){ for (i=0;i<=200;i++) { if(a [i]) { if(i) printf(" "); printf("%d",i); } } printf("\n"); } return 0; }
相关文章推荐
- HDU 1466 计算直线的交点数
- hdu 1466 计算直线的交点数
- HDU 1466 计算直线的交点数
- HDU - 1466 计算直线的交点数 (dp)
- hdu 1466 计算直线的交点数 (数学)
- hdu1466 计算直线的交点数
- HDU 1466 计算直线的交点数(动态规划)
- HDU-1466 计算直线的交点数 DP
- 【HDU-oj】-1466-计算直线的交点数(DP)
- Dynamic Programming 练习(题源 hdu 1466, 计算直线的交点数)
- hdu 1466 计算直线的交点数 动态规划第一题
- HDU 1466 计算直线的交点数 (DP)
- HDU---1466-计算直线的交点数(DP)
- HDU - 1466 计算直线的交点数
- HDU 1466 计算直线的交点
- hdu 1466 计算直线的交点数 (数学)
- hdu 1466 计算直线的交点数(动态规划)
- hdu 1466 计算直线的交点数
- 【HDU 1466 计算直线的交点数】+ dp
- HDU 1466 计算直线的交点数