源于网络
文章平均质量分 77
zhuCsustICPC
这个作者很懒,什么都没留下…
展开
-
去重复数
#include "stdio.h"void main(){int array[10] ,n_array[10];int n=10; //n为数组中元素个数。for(int i=0;iscanf("%d",&array[i]);n_array[0]=array[0];int cnt=1;for( i=1;i{ int sign =1; //设置标志位,用于检查某数字是否在数组中出现过;for(int j=0;j{ if(array[i]==n_array[j]) {sign=0; break;}}if(si转载 2010-06-15 00:03:00 · 569 阅读 · 0 评论 -
全排列的生成算法
全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。任何n个字符集的排列都可以与1~n的n个数字的排列一一对应,因此在此就以n个数字的排列为例说明排列的生成法。n个字符的全体排列之间存在一个确定的线性顺序关系。所有的排列中除最后一个排列外,都有一个后继;除第一个排列外,都有一个前驱。每个排列的后继都可以从它的前驱经过最少的变化而得到,全排列的生成算法就是从第一个排列开始逐个生成所有的排列的方法。全排列的生成法通常有以下几种:字典序法递增进位数制法递减进位数制法邻位交换转载 2010-06-15 00:07:00 · 688 阅读 · 0 评论 -
计算组合数
计算组合数最大的困难在于数据的溢出,对于大于150的整数n求阶乘很容易超出double类型的范围,那么当C(n,m)中的n=200时,直接用组合公式计算基本就无望了。另外一个难点就是效率。 对于第一个数据溢出的问题,可以这样解决。因为组合数公式为: C(n,m) = n!/(m!(n-m)!)为了避免直接计算n的阶乘,对公式两边取对数,于是得到: ln(C(n,m)) = ln(n!)-ln(m!)-ln((n-m)!)进一步化简得到:这样我们就把连乘转换为了连加,因为ln(n)总是很小的转载 2010-06-15 10:08:00 · 1115 阅读 · 1 评论 -
组合数计算问题的总结
计算组合数的方法有3种(鄙人目前知道的)1.(n,m)=n!/((n-m)!*m!)这种计算如果m n很大的话 极易益出2.(n,m)=n/m*(n-1,m-1);这种不容易保持精度:可以用double型进行保持double zuhe(int a,int b)//(b,a)//效率不怎么高{ double sum=1; while(a) { sum*=b/a; /* while(sum>=32767) //取模的时候 sum-=32767;*/转载 2010-06-15 10:59:00 · 984 阅读 · 0 评论 -
并查集拓展应用
这篇文章原创的,见笑。。。 并查集是一种优秀的数据结构,能够支持快速的查找某元素所在的集合以及合并操作。最常见的并查集的实现方式是森林,通过记录所有结点或者部分结点(下面会看到)的父节点来记录森林。并查集的详细实现方式可以参考CLRS第二十一章。 信息学竞赛中基本的并查集题目比较少,大多要对并查集进行一些拓展,多记录一些信息以完成计算。竞赛的题目有很大一部分是询问两个结点的相对原创 2010-08-16 21:46:00 · 793 阅读 · 0 评论