运算涉及到很多double间时,要用eps。
一。判断x是否为a,要用abs(x-a)<eps;
二。判断x是否大于a,用 x+eps>a||x>eps+a;
posted @
2009-02-13 13:27 蔗晨 阅读(70) |
评论 (0) |
编辑 收藏
pku1860 货币兑换,问能不能从一种货币出发,再回到这种货币,并且钱增加。
首先是单源的。
钱要增加并回到开始的,说明有 “赚钱的回路”存在。BEL本来可以判断负权回路。只需把中间对D的操作改一下即可。
posted @
2009-02-13 12:55 蔗晨 阅读(107) |
评论 (0) |
编辑 收藏
posted @
2009-02-12 12:43 蔗晨 阅读(79) |
评论 (0) |
编辑 收藏
posted @
2009-02-11 11:31 蔗晨 阅读(202) |
评论 (0) |
编辑 收藏
pku1426.
只用1,0表示成一个数的倍数。
状态空间BFS。只要是状态能够表示的就能搜索。比如,黑白棋。
一。倍数就想到余数。所以状态就只有余数的个数那么多。
二。所有的1,0的数:从1开始乘10,加1,一直下去。
三。像这种复杂度估计不出来的,先要最简单的方法搜搜看,可能就是考这种简单的方法。
posted @
2009-02-10 21:21 蔗晨 阅读(125) |
评论 (0) |
编辑 收藏
用 模素数法 作散例函数,用链表解决冲突问题。
hash函数:
int ELFhash(char *key){// UNIX 系统ELF字符串散列函数,对字符串的处理一般使用此函数
unsigned long h=0;
while (*key)
{
h=(h<<4)+*key++;
unsigned long g=h & 0xf0000000L;
if (g) h^=g>>24;
h &= ~g;
}
return h%M;
}
解决冲突:
k=ELFhash(fg[i]);//计算Hash函数
p=new node;//建立Hash Table
p->num=i;
p->next=link[k];
link[k]=p;
寒假热身赛求 凸起的三个数组合有几种。
1,对ai,求出他左边有几个数比他小,右边有几个数比他小,相乘。
所有的ai相加。
2,以左边比他小都个数为例,
以c[k]=t 表示k的数有t个。对a[i],sigama{c[a[i]-1}就是比a[i]小的数的个数。
有里 sigama就可以用树状数组
posted @
2009-02-06 19:57 蔗晨 阅读(119) |
评论 (0) |
编辑 收藏
有n个人,编号1-n,从x开始报,报到第k个淘汰一个。
tp=0;
for(i=2;i<=n;++i)tp=(tp+k)%i;
tp+=x;
tp即为答案。
因此要计算出从谁开始报。有时候第一个就先算淘汰,则第一个开始报的是n-k+2.
posted @
2009-02-06 19:48 蔗晨 阅读(85) |
评论 (0) |
编辑 收藏
所有的基数都变为5,9,13 ... 所以筛法中确定一个prime后,乘5,9,13 。。。
for(i=5;i<N;i+=4)
{
for(j=5;;j+=4)
{
tp=i*j;
if(tp>N)break;
if(a[i]==0)a[tp]=1;
else a[tp]=2;
}
}
0,表示素数;1,表示semi;2,表示多余semi的;
posted @
2009-02-06 19:39 蔗晨 阅读(154) |
评论 (0) |
编辑 收藏
一。匈牙利要区分好两个集合。若题中没有明确区分可以把所有的点都各放在2个集合中,然后最大匹配数变为2倍。ex,girls and boys
二。在二分图中找最多的点,使各点都不相邻。答案是 顶点数-最大匹配数。
三。有向图的最小路径覆盖问题:
定点数-最大匹配数。其中最大匹配的二分图是,所有定点变为2个,pi1,pi2.若pipj边存在则在二分图中增加pi1pj2,若pjpi存在则在二分图中增加pj1pi2.ex,air raid
posted @
2009-02-06 19:30 蔗晨 阅读(100) |
评论 (0) |
编辑 收藏