关于相交线产生区域问题和错误排序

来源:互联网 发布:淘宝店铺名字大全高档 编辑:程序博客网 时间:2024/05/17 22:30

  今天在杭电上做题目时碰到一题说求N条折线最多能分割多少个区域的问题。花了一个小时,把折线和直线的情况都推了一边,算是做个笔记吧

直线情况  :  当一条直线时 ,有2个区域。两条直线,四个区域,此时有1个交点,三条直线要有3个交点才能产生最多区域。


我们可以发现,每增加一条直线,交点数目增加 n-1个,n-1即为第n条直线与前N-1条直线都有交点。而n-1个交点会多增加N-2个区域,同时还有两个射线,增加两个,即我们可以得到 A[n]=A[n-1]+n获得递推公式,然后可以解得A[n]=(n*n+n+2)/2;

折线情况:当有一条折线时,有2个区域,两条折线时,有7个区域;

  

每增加一条折线,交点个数增加4n-4,设交点个数为B[n];B[n]=B[n-1]+4*n-4;4*n-4是怎么来的呢?它表示的是n-1条折线共有2(n-1)条射线,增加一条折线,折线的每边都与这2(n-1)条射线有交点,则即为4*n-4;再联系上面直线情况,则增加的区域数目为4*n-6;两条射线增加2个区域,还有就是顶点增加一个区域,最终得到递推公式为

A[n]=A[n-1]+4*n-3,根据递推公式,A[n]=2*n*n-n+1;

     错误排序。说的是有N个卡片,写着N个不同人的名字,让这N个人都拿一张,问每个人拿到的卡片上名字写的都不是自己共有多少种情况或概率;

这道题我一开始想着用循环和递归,将一个大小为N 按升序排列的数组进行操作,就比如A[0]我把1——N-1之间的数分别与它交换,然后同样处理后面的数字,研究半天也没研究出来,后来就果断换方法了。研究N-1和N的关系,设错误排序的总和为A[N];A[N]=A[N-1]*(N-1)+A[N-2]*(N-1);A[N-1]*(N-1)表示的是:当前N-1个已经是完全错误排序,那么我增加一个,使得达到N个,第N个可以与前N-1个任意一个进行交换顺序,使得N个都完全错误排序,A[N-2]*(N-1)表示:当前N-1个只有一个拿着自己名字的卡片,这个人我们是随便从N-1个人中挑选出来的,然后将这个人与第N 个人交换,使得N个达到完全错误排序,如果前N-1个人中,超过1个人拿到写着自己名字的卡片,那么,N个人无法完成错误排序,即A[N]=A[N-1]*(N-1)+A[N-2]*(N-1);

原创粉丝点击