2011年4月5日
摘要: ——problem:有N头牛,每头牛有两个参数T和D。把每头牛送到目的地要2*Ti的时间,在这期间其他牛会吃掉2*Ti*SEGMA(Di)的花,问如何排放牛的顺序使得被吃到的花最少——solution:排序——url:http://poj.org/problem?id=3262一开始以为只要按照D排序就可以了,结果WA了。正确的应该按照D/T从大到小排序。证明如下:任取两头牛i和j,这两头牛需要的总时间为2*(Ti+Tj),在此时间中其他牛吃的花是一定的,因此只要考虑这两头牛就可以了。若先送牛i,则牛j吃掉的花为2*(Ti*Dj),若先送牛j,则牛i吃掉的花为2*(Tj*Di),我们只要在两者 阅读全文
posted @ 2011-04-05 13:56 风也轻云也淡 阅读(218) 评论(0) 推荐(0) 编辑
  2011年4月2日
摘要: ——problem:求平面上矩形的面积,重复的只算一次。矩形的一边和X轴重合。——solution:离散化+线段树——url:http://poj.org/problem?id=3277比赛的时候先离散化试了下,超时。于是只能再写线段树,结果线段树写撮了。注意:1、40000个矩形,边大概有80000多个,线段树的数组至少要开到80000×3=240000。2、所有矩形先按从小到大排序。这样插入的时候不必判断已经插入矩形的高度,直接插就可以了。3、注意面积会超过int的范围,要开long long。代码:第一个代码矩形没有排序。于是node有三个域,h记录高度(如果左右子树的高度不同 阅读全文
posted @ 2011-04-02 21:39 风也轻云也淡 阅读(299) 评论(0) 推荐(1) 编辑
  2011年3月27日
摘要: ——url:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1468——problem:路径A比路径B时间少"且"费用低才算A比B"好", 所以B最好只是意味着没有别的路径比它好, 而不是B比别的路径都好. 听起来很拗口, 因为本题的目标函数值不具有全序关系, 即存在不可比较的情况. 所以时间4费用5和时间5费用4的两条路径无法比较. 如果没有比它们更好的, 则它们都是最优"双调路径"(bicriterial应该是双重准则的意思). 另外, 如果有两条时间4费用5的最优双调路径, 则在答 阅读全文
posted @ 2011-03-27 18:58 风也轻云也淡 阅读(539) 评论(0) 推荐(0) 编辑
摘要: ——problem:起点到终点的严格K短路(每个点在路径中最多出现一次)——solution:二分+dfs+dijkstra优化——url:http://acm.sgu.ru/problem.php?contest=0&problem=145一开始以为A*就可以了。鉴于A*本来也不会,所以就先学了遍A*。写完发现A*求的是非严格最短路。最后是二分答案+dfs+dijkstra优化过的。注意:1、当当前长度搜到的路径数已经大于K的话,就没必要再搜下去了。不过这样做的话,每次都要初始化下VIS数组。2、用dijkstra求出终点到各点的最短路,用来在DFS的时候剪枝。3、注意二分的问题,如 阅读全文
posted @ 2011-03-27 15:29 风也轻云也淡 阅读(290) 评论(0) 推荐(0) 编辑
  2011年3月26日
摘要: ——problem:求只含有因子2,3,5的第K大的数——solution:标记三个下标P2,P3,P4表示2,3,5分别乘到第几个数了。每次在2*(P2+1),3*(P3+1),5*(P5+1)里取最小的一个数放到数组了,然后那个下标+1. 阅读全文
posted @ 2011-03-26 22:00 风也轻云也淡 阅读(72) 评论(0) 推荐(0) 编辑
摘要: ——problem:度限制生成树——solution:Kruskal算法框架:1.先求出最小m度限制生成树;2.由最小m度限制生成树得到最小m+1度限制生成树;3.当dT(v0)=k时停止(即当V0的度为k的时候停止);第一步:求解最小m度限制生成树:原图中去掉和V0相连的所有边,得到m个连通分量,而这m个连通分量必须通过v0来连接,所以,在图G的所有生成树中dT(v0)≥m。也就是说,当k<m时,问题无解。对每个连通分量求一次最小生成树,对于每个连通分量V’,求一点v1,v1∈V',且ω(v0,v1)=min{ω(v0,v')|v'∈V'},则该连通分量 阅读全文
posted @ 2011-03-26 21:43 风也轻云也淡 阅读(266) 评论(0) 推荐(0) 编辑
摘要: ——problem:有度限制的生成树个数——solution:Cayley公式,Prüfer编码,递推Cayley公式是:一个完全图K_n有n^(n-2)棵生成树,换句话说n个节点的带标号的无根树有n^(n-2)个。Cayley公式的一个非常简单的证明,证明依赖于Prüfer编码,它是对带标号无根树的一种编码方式:给定一棵带标号的无根树,找出编号最小的叶子节点,写下与它相邻的节点的编号,然后删掉这个叶子节点。反复执行这个操作直到只剩两个节点为止。由于节点数n>2的树总存在叶子节点,因此一棵n个节点的无根树唯一地对应了一个长度为n-2的数列,数列中的每个数都在1到n的范 阅读全文
posted @ 2011-03-26 21:40 风也轻云也淡 阅读(450) 评论(0) 推荐(0) 编辑
摘要: ——problem:求起点到终点的非严格最短路——solution:dijkstra+A*以下转载自:http://www.cppblog.com/linyangfei/archive/2008/07/26/47662.html【 先说说启发式搜索吧。通常在解决问题的时候,我们需要用到搜索算法,由已知状态推出新的状态,然后检验新的状态是不是就是我们要求的最优解。检验完所有的状态实际上就相当于遍历了一张隐式图。遗憾的是,所有的状态组成的状态空间往往是成指数级别增长的,也就造成了遍历需要用到指数级别的时间,因此,纯粹的暴力搜索,时空效率都比较低。当然,我们在生活中遇到了类似于搜索的问题,我们并不会 阅读全文
posted @ 2011-03-26 21:23 风也轻云也淡 阅读(347) 评论(0) 推荐(0) 编辑
  2011年3月25日
摘要: ——problem:n个点,边有两种,一种是普通的路,一种是近道,求在规定时间内从起点到终点用的最少的近道数是多少。——solution:二维DIJKSTRA一开始犯傻了,二分用的近道数,看能不能再规定时间内到达……结果超时。其实直接求DIST[I][J]就好了,然后找个J最小的且在规定时间的的J就是答案了。结果还是超时……感觉50*100*100*100应该不会超……看了下题解,有个小优化,Limit初始为近道数。每次到终点时记录下用的近道数,如果比LIMIT小就更新,这样如果当前状态用的近道数比limit还大的话就直接忽略。View Code 1 #include<stdio.h&g 阅读全文
posted @ 2011-03-25 22:06 风也轻云也淡 阅读(179) 评论(0) 推荐(0) 编辑
  2011年3月20日
摘要: ——url:——problem:二维平面上有N个点,求从1到N的最短时间,转向需要时间,每度一秒。——solution:二维DIJKSTRA,DIST[I][J]表示起点到I的最短时间,I的前驱为J,用来计算转向时间。注意:1、转向角度<=180度。2、用atan2比atan好,atan2值域范围-pi到pi。3、计算转向角: 例如:由P1经过P2到P3 angle=fabs(atan2(p2.y-p1.y,p2.x-p1.x)【P2-P1向量的方向角】-atan2(p3.y-p2.y,p3.x-p2.x)【P3-P2向量的方向角】)——————————————————————————— 阅读全文
posted @ 2011-03-20 21:52 风也轻云也淡 阅读(262) 评论(0) 推荐(0) 编辑