08 2012 档案
摘要:随便看到的一个题题目:http://poj.org/problem?id=1674给出 n 个数,问最小的交换次数可以让这 n 个数变成升序排列的这个一开始还以为dp呢,可是想了好长时间也不知道怎么dp,原来是找给的n个数里的环的问题,比如说样例 22 3 5 4 1 这里面有两个环 {2,3,5,1},{4},2应该在的位置是 3,3应该在的位置是 5,5应该在的位置是 1,然后1 就到 2 了,所以就是一个环,然后最小的交换次数就是 n - 环数View Code 1 const int N = 10010; 2 struct node 3 { 4 int x; 5 in...
阅读全文
摘要:先说一下叉积求面积View Code 1 struct node 2 { 3 int x; 4 int y; 5 }point[N]; // 数组保存多边形顶点,但是必须按顺序(逆或顺)保存 6 double area(int n) // n 表示多边形的顶点数 7 { 8 int i; 9 double a = 0;10 for(i = 0; i < n; i++)11 {12 int j = (i + 1) % n; // 保证最后一个和第一个连起来13 a += point[i].x * point[j...
阅读全文
摘要:今天突然看见凸包题,然后翻看自己以前学的时候写的博客,竟然发现那个学习的链接没了,就去看了算法导论,然后对着模板,把这个算法看了一遍,东西还是要多看几遍的,每次看都有不同的感受,总会有那么一次,你会发出一句感慨:呃,原来是这样啊!现在把模板整理一下吧先说一下求解步骤:1.首先在输入的点集中找出一个对照点,放入到 p[0]中,这个对照点就是 在点集的最下,最左的那个点2.对 1 ~ n - 1的点按相对于 对照点的极角从小到大排序,如果极角相同那么就按距离对照点的远近从小到大排序3.把输入的点集的前两个点放入到栈中,然后依次扫描剩余的点,把不是凸包顶点的点从栈中剔除,沿逆时针方向通过凸包时,在每
阅读全文
摘要:两道简单的 dp题目题目:http://poj.org/problem?id=1159给一个字符串添加字符,使字符串变成回文串,很简单的一个dp,不过还是MLE了一次,改成了滚动数组就可以了View Code 1 const int N = 5010; 2 int dp[2][N]; 3 char str[N]; 4 int main() 5 { 6 int i,j,n; 7 //freopen("data.txt","r",stdin); 8 while(scanf("%d",&n) != EOF) 9 {10 getcha
阅读全文
摘要:题目:http://poj.org/problem?id=1319题意:给出一个容器的尺寸 a * b,在这个容器里装直径是单位长度的管子,有两种装的办法,一种是题目里面给的图 a,图 b,另一种是图 c,图 d,问最多可以装多少个管子,前两个图那样的很好计算,管子的数目就是 floor(a) * floor(b) (floor(x)是指不大于 x 的最大正整数,如 floor(2.8) = 2),如果是后面两组(交错装)那么就要考虑,是 a 为行数,还是 b 为行数两种情况了,后面两种方法画图可以知道,除了第一行管子的高度是 1,其他行的高度为 2 * ( sqrt(3) / 4), 如果宽
阅读全文
摘要:半平面交,求解多变形内核的问题 感觉一个讲的很清晰的链接 http://www.cnblogs.com/ka200812/archive/2012/01/20/2328316.html首先说一下什么是多边形内核,内核是一个点集,该集合内的任意一个点与简单多边形边界上一点的连线都在简单多变形内,也可以说集合内任意一点都可以看见该多边行内的任何一个地方。求解多边形内核的方法是用多边形的两个顶点组成的线段不断的去切割多边形,切割到最后剩下的,就是内核区间了。一条直线可以将平面切割成两个区域,假设直线方程为ax+by+c==0,那么,两个平面可分别表示成ax+by+c>=0 和 ax+by+c&
阅读全文
摘要:题目:http://poj.org/problem?id=2121很很简单的题,权当用map 做着玩吧,就是给出英文的数,然后让你转换成数字,注意当是 百,千,百万的时候的处理,不为别的,就为了那个打表,打的眼晕,最后还是打错了,交了两次才发现,汗View Code 1 #include<iostream> 2 #include<sstream> 3 #include<cstdio> 4 #include<cstring> 5 #include<algorithm> 6 #include<string> 7 #includ
阅读全文
摘要:题目:http://poj.org/problem?id=3286假设从 1 到 m的数中 含有 0 的个数为 numm,从 1 到 n 含有 0 的个数为 numn 那么要求 从 n 到 m 的数里含有 0 的个数 ans = numm - numn + sum(n 里面含有 0 的个数)对于给的数N,从右到左枚举每一位,当枚举第 i 位时,它左边的数记为 left,从它自身到最后记为 right, 1 若第 i 位为 0,说明 N里面本身有一个0 , 求出比 left 0 right(— 0 —) 小的数+1 加至 sum ; 2 若第i 位不为0,则 N 该位没0,那么小于 left 0
阅读全文
摘要:题目:http://poj.org/problem?id=2231题意:给出 n 头牛,给出 n 头牛的位置,求出每头牛到其他牛的距离的总和按给的牛的位置从小到大排序,假设 第 i 头牛的位置为 xi ,那么它前面的牛的个数假设是 N 个,并且我们可以求出它前面这些牛的 x (位置)值的和 记为 sum,那么它前面的这些牛到他的距离就是 N * xi - sum,同样处理它后面的那些牛的距离,对每头牛都这样处理后,把每头牛到其他牛的距离总和相加,就是答案代码写的有点乱View Code 1 #include<iostream> 2 #include<cstdio> 3
阅读全文
摘要:题目:http://poj.org/problem?id=3150题意:给出 n 个数构成一个环,给出 m d k,每一个数从它的两边(连续的)各找 d 个数和这个数相加 再取余m后更新这个数,问 k 次操作后,输出新的n 个数的顺序。不知道怎么优化,看了别人的解析 http://hi.baidu.com/moon_1st/item/0381d80a85fd258a3d42e2f0,循环矩阵经过 k 次幂后仍然是循环矩阵,而且有 a[i][j] = a[i - 1][j - 1]成立,这样转移矩阵的下一列就可以由这一列转换过去,降低复杂度题目:http://poj.org/problem?id
阅读全文
摘要:题目:http://poj.org/problem?id=3318题目中明确交代,0(n ^ 3) 会 TLE,可是一开始还就没看见,以为在计算矩阵时加两个优化可在 2s 挤过去呢,然后就TLE了三次,看别人的说是有一个结论 A * B * X == C * X时,有 A * B == C成立(成立的概率很大),然后 X 就是用随机函数求的View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 #incl
阅读全文
摘要:题目:http://poj.org/problem?id=3070算是矩阵快速幂的模板吧View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 #include <vector> 6 #include <math.h> 7 #define N 160 8 #define mod 10000 9 #define _clr(a,val) (memset(a,val,sizeof(a))
阅读全文
摘要:状态压缩dp,感觉还是不清晰,虽说就两种状态 0 1,但是感觉变化太多了,而且状态转移也不好想题目:http://poj.org/problem?id=3254题意:给出 N * M的图,上面只有 0 或者 1两种情况,如果是 1 表示这里可以放牛,如果是 0 表示不可以放牛,而且牛是不可以相邻的,问在这片区域内最多有多少种放牛的方案很简单的一个状态压缩 按给出的样例来说先看第一行 (1 表示该位置有牛,0 表示该位置没有牛)可以用二进制串来表示牛的放置情况0 0 0 (0) 0 0 1(1) 0 1 0 (2) 1 0 0(4) 1 0 1(5) 也就是题目中给的第一行最多有这五种情况,分.
阅读全文
摘要:两道树形 dp题目:http://poj.org/problem?id=2057题意:蜗牛的房子丢在了树上的某个节点上(每个节点的可能性相同),有些节点上有虫子,可以告诉蜗牛它的房子是不是在以这个节点为根的子树上,蜗牛找到房子的最小数学期望值是多少。首先期望是:找到房子走的步数 / 叶子节点的总数。叶子节点总数是固定的,那么走的步数越少,期望值也就越小,因为一个节点可能有多个孩子,从不同的孩子开始走得到的步数是不同的,优先选择哪个孩子这里用了贪心,解释见代码。定义三个数组su[N] // su [i] 表示走到以 节点 i 为根的子树成功找到房子的步数 如果 i 是叶子节点那么 su [i]
阅读全文
摘要:题目:http://poj.org/problem?id=3280题意:给出一个字符串,可以增加 或 删除 个别字符,增加和删除都是有权重的,求在最小权重下把给的字符串变成回文串感觉类似于求最长公共子序列的,把每个字符串增加和删除的权重存入两个数组,当前后对称的两个字符串相等时 dp[j][k] = dp[j + 1][k - 1],否则 dp[j][k] = min( min(dp[j+1][k]+add[str[j]-'a'], dp[j][k-1]+add[str[k]-'a']), min(dp[j+1][k]+sub[str[j]-'a'
阅读全文
摘要:题目:http://poj.org/problem?id=3301题意:给出一些点的坐标,求一个最小的正方形来覆盖所有的点用三分枚举转角即可,坐标转换公式: x’ = x * cosa - y * sina; y’ = y * cosa + x * sina;View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 7 #define N 60 8 #define inf 1000
阅读全文
摘要:题目:http://poj.org/problem?id=3373题意:给出2个整数n(n<10^100)和k(k<10000),求满足以下条件的整数m 1、m与n位数相同 2、m能被k整除 3、满足以上两点时,m和n在相同位置的地方,数字不同的个数最少 4、满足以上三点时,m值最小题目里面那个mod(看的别人的)定义数组mod[101][10],mod[i][j]=((10^i)*j)%k,先求出:0123456789(%k)0102030405060708090(%k)0100200300400500600700800900(%k).....通过递推式mod[i][j]=(mo
阅读全文
摘要:题目:http://acm.hdu.edu.cn/showproblem.php?pid=4350以为移动的都是 0 到 r - 1 内的牌,所以直接模拟就行了View Code 1 #include <stdio.h> 2 #include <iostream> 3 #include <string.h> 4 #include <math.h> 5 #define N 60 6 #define _clr(a,val) (memset(a,val,sizeof(a))) 7 8 using namespace std; 9 10 typedef
阅读全文
摘要:比赛时看完了 4 5 6 题,第四题感觉是线段树,想等会儿让HG 写,5 题没看懂,是后来LM给我讲的,所以一开始一直在研究 6,等LM 跟HG的题都过了,6 的样例还是没出来,然后跟LM一起想,还是没思路,决定去看别的题了,最后HG说可能是置换群的题目,他说他正好刚刷过去,说让他想吧,比完赛一看确实是有关置换的,但我们还是没做出来,5 后来到是猜到了一点的意思,但是看了题解后我才知道自己是多么的无知,竟然想着用打表的方式过,比赛还是充分体现了自己没学到的很多,学到了不会用的也很多,多做多练思路是很有必有的下面都是比赛时过题较多的,做过的无视就可以了题目:http://acm.hdu.e...
阅读全文
摘要:题目:http://poj.org/problem?id=3411题意:n 个城市,m 条路,每条路都有两种情况的费用,一种是 在 b 城市付费 r,一种是提前在 c 城市付费 p 元,问从 1 到 n 最小的花费思路:邻接表 + dfsView Code 1 #include <stdio.h> 2 #include <iostream> 3 #include <string.h> 4 #include <algorithm> 5 #define N 20 6 #define inf 100000000 7 #define _clr(a,val
阅读全文
摘要:虽然训练计划里这两道题目不是归为线段树的,但是觉得这几道题目都是可以用线段树解决的。题目:http://poj.org/problem?id=3468题意:给你N个数,下面是两种操作Cabc是说把从a 到 b 的数全部加上 c ,Q a b 是说询问 从a 到 b的和思路:线段树的成段更新,线段树中节点除了区间端点外和保存区间和以外,加一个记录权重的,也就是当一段被加上一个数时,这段的权重进行修改,根据权重和原先记录的和求得修改以后的和View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <
阅读全文
摘要:题目:http://acm.hdu.edu.cn/showproblem.php?pid=2444题意:给出一些两两认识的学生,把这些学生分成两组,每组中的学生都不互相认识,如果可以完成,那么把他们安排进一些双人间中,每个房间中只能住相互认识的学生,如果不可以分成两组 输出 No,可以住的那么输出最多需要多少个房间思路:求是否可以分成两组用dfs黑白染色,看给出的关系是否是一个二分图。判断房间数用则用二分匹配对无向图进行匹配,求出最大匹配数,即为房间数。感觉更像模板题,直接套用最大匹配模板就可以了View Code 1 #include <stdio.h> 2 #include &
阅读全文
摘要:要说用到KMP算法,觉得也就是用到KMP的一个模板,主要还是用了KMP求出next 之后怎么判断才是关键,这两道题目是一个做法,就是最后输出稍有不同poj2406:以前在哈工大那个ACM基础教程上做过这个题目,这次做训练计划又敲了一遍,至于思路,贴个链接吧,就不重复说了http://www.cnblogs.com/fxh19911107/archive/2011/12/02/2271865.htmlpoj 1961:http://poj.org/problem?id=1961题意:不知道怎么表达,还是拿第二个例子来说吧 aabaabaabaab 这 从第一个 到 第二个 a 重复了 2 ...
阅读全文
摘要:感觉这次数学题挺多的,这次的数据应该不能说水了,有的卡的确实挺厉害,但觉得有的题还是很无语,比如说那个Trouble,二分感觉不超的,就是过不了,不是WA,就是TLE,还会MLE,一个简单的hash就可以过。是不是太卡算法了。题目:http://acm.hdu.edu.cn/showproblem.php?pid=4334这道题真没什么好说的View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 #def
阅读全文
摘要:题目:http://poj.org/problem?id=2492题意:给出一些虫子,然后给出一些关系,每行的两个数 x y 表示 x 和 y 可以交配,问你是否可以在里面找出同性恋思路:利用并查集记录他们的祖先,需要再用一个数组保存他们属于的种类,1代表一个类,0代表另一个类,在递归找祖先时同时给他们分类。然后询问的时候看他们是不是一个祖先,如果是一个祖先然后看他们是不是同一类,如果是证明他俩是同性恋;如果他们的祖先不相同,那么就要进行合并操作,同时修改一个祖先的类View Code 1 #include <stdio.h> 2 #include <string.h>
阅读全文
摘要:题目:http://acm.hdu.edu.cn/showproblem.php?pid=4320题意:给一个A进制的有限小数,问是否可以转换为B进制的有限小数。这道题目是真心不懂,即使看了解题报告也不知道怎么个情况,就知道一条结论:A的所有质因子都包含在B中,则可以转换。但具体怎么证明,纠结 ~ing。表示打表我怎么都WA(可能是表打错了给)童鞋提示用 gcd 不断的去降 a。想想也是,既然要求a 的所有质因子是否都含在b中,那么不断的求他们的最大公约数,然后降 a ,直到他们的公约数 <= 1这时判断 a,如果a为 1那么就是a的所有质因子都在b中View Code 1 #inclu
阅读全文

浙公网安备 33010602011771号