上一页 1 2 3 4 5 6 7 8 9 ··· 12 下一页

2012年8月12日

poj2524(并查集)买一送一hdu1213

摘要: 已知有n个大学生,其中有m对宗教信仰相同的学生,请你估算这n个学生中最多有多少种宗教信仰。依旧是简单的并查集应用。宗教信仰的最大值为学生数n,因此一开始把n个学生作为n个集合,对给出的每对大学生 a 和 b ,如果他们在不同的集合,就合并他们,然后宗教数减一。 1 #include <stdio.h> 2 using namespace std; 3 4 int sum; 5 int set[50005]; 6 7 void makeset(int n) 8 { 9 for(int i=1;i<=n;i++)10 {11 set[i]=i;12 ... 阅读全文

posted @ 2012-08-12 15:36 矮人狙击手! 阅读(682) 评论(0) 推荐(0) 编辑

poj1611(并查集)

摘要: 1 #include <stdio.h> 2 using namespace std; 3 int set[30005]; 4 int num[30005]; 5 void makeset(int n) 6 { 7 for(int i=0;i<n;i++) 8 { 9 set[i]=i;10 num[i]=1;11 }12 }13 14 15 int findset(int x)16 {17 if(x!=set[x])18 {19 set[x]=findset(set[x]);//之所以不可以直接返回是因... 阅读全文

posted @ 2012-08-12 13:03 矮人狙击手! 阅读(254) 评论(0) 推荐(0) 编辑

2012年8月11日

zoj2104(水题一枚)

摘要: 1 #include <stdio.h> 2 #include <algorithm> 3 #include <cstring> 4 using namespace std; 5 6 struct str 7 { 8 char s[30]; 9 int num;10 };11 12 str a[1005];13 14 void init(int k)15 {16 for(int i=0;i<k;i++)17 {18 a[i].num=0;19 }20 }21 22 23 int cmp(str a , str b)24 {25 ... 阅读全文

posted @ 2012-08-11 17:58 矮人狙击手! 阅读(570) 评论(0) 推荐(0) 编辑

poj2255(递归)

摘要: 简单题已知前序遍历,中序遍历,求后序遍历思路,找到根,找到左子树,找到右子树 1 #include <stdio.h> 2 #include <cstring> 3 using namespace std; 4 5 char a[30],b[30]; 6 int count; 7 8 void find(int start, int end) 9 {10 int i;11 if(start>end)12 {13 return;14 }15 char root=a[count++];16 for( i=start;i<=end... 阅读全文

posted @ 2012-08-11 15:28 矮人狙击手! 阅读(255) 评论(0) 推荐(0) 编辑

2012年8月10日

poj1463

摘要: 状态设计: 1、dp[i][0],表示在结点 i 没放置士兵的情况下,看住以结点 i 为根的子树的所有边所需的最少士兵; 2、dp[i][1],表示在结点 i 放置士兵的情况下,看住以结点 i 为根的子树的所有边所需的最少士兵。状态转移: 1、dp[i][0]=∑dp[j][1],j 是 i 的儿子结点;(根结点不放士兵时,与其相连的边必须由儿子结点来看守) 2、dp[i][1]=dp[i][1]+∑ ( MIN ( dp[j][0] , dp[j][1] ) ),j 是 i 的儿子结点。 (根结点放士兵时,儿子结点可放可不放)初始化: d[i][0]... 阅读全文

posted @ 2012-08-10 21:13 矮人狙击手! 阅读(433) 评论(0) 推荐(0) 编辑

poj3140(树形dp)

摘要: 这道题是说,给出一棵树,每个节点有一个权值,要求去掉一条边所能获得的两棵树的最小的权值差,其实不能说是dp因为除了最后一步涉及到了取最小之外,其他的地方都是在枚举而已,没有什么状态转移之类的东西存在,只能说是一道简单的树形的搜索如果你wa了,请检查1:abs()函数必须要自己写,因为调用的int abs()型的,多以必错无疑2:是否输入输出的每个地方都已经改成了long long 或者__int64,输入的时候是scanf("%I64d",&a),输出的时候是printf("%i64d",a).我自己的就是某些地方没有全改成这样的输入输出wa了两 阅读全文

posted @ 2012-08-10 17:10 矮人狙击手! 阅读(630) 评论(0) 推荐(0) 编辑

poj1192(树形dp)

摘要: 感谢涛涛不解这道题着实花了很长时间才搞明白,对图的知识忘得太多了,看这道题之前最好先把图的邻接表表示方法看下,有助于对这道题的理解,这道题让我对深度优先遍历又有了进一步的了解这道题最好画个图,有助于理解,不过你要是画个错误的图此题就无解了其实就是一个求无向树的所有子树和的最大值树形dpdp[i][0]表示以i为根,不包括i结点的子树获得最大权dp[i][1]表示以i为根,包括i结点的子树获得的最大权dp[i][0] = max(dp[k][0], dp[k][1]) k为i的所有孩子结点dp[i][1] = i结点的权 + dp[k][1] 如果dp[k][1] > 0 1 #inclu 阅读全文

posted @ 2012-08-10 12:30 矮人狙击手! 阅读(1279) 评论(0) 推荐(0) 编辑

2012年8月9日

hdu4350

摘要: 刚开始我被这道题吓到了,心想这要移动这么多次,这不是要超时吗,后来又感觉是约瑟夫问题,唉,想起约瑟夫问题就想起了那个难记的公式,唉,直接放弃了,后来才发现,这道题原来是这么的easy,水题思路:认真观察即可发现,这道题是有规律的,不会让你去循环这么多次,拿个简单的的例子试下,你会发现,当移动r(题目中给的数)次时,数组又回到了原来的样子,所以可直接循环n%r次、 1 #include <iostream> 2 3 using namespace std; 4 int a[55]; 5 int tmp[55]; 6 int main() 7 { 8 int Case; 9 ci... 阅读全文

posted @ 2012-08-09 18:19 矮人狙击手! 阅读(256) 评论(0) 推荐(0) 编辑

hdu4351

摘要: 这道题我感觉应该用线段树来做,写了之后还是超时,别的优化方法想不到了,欢迎各位指教(补充一点优化的方法,第一求root digit的时候可以直接对9取余,如果是9的倍数,那么直接就是9,第二在build的时候在最后面加这样一句话:if(b[i].sum>9) b[i].sum-=9;) 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 int a[100005]; 6 int res[100005*4]; 7 struct 阅读全文

posted @ 2012-08-09 17:41 矮人狙击手! 阅读(309) 评论(0) 推荐(0) 编辑

2012年8月8日

poj(2325)线段树

摘要: 这里介绍另外一种解法,此题可以用线段树,可以用树状数组其实这题求的都是下面的和左面的,线段树这种数组结构刚好可以满足,为什么呢?这里稍微解释下吧,也有助于以后的复习看上面这个图,[1,1],[2,2]这样的叶节点表示题目的的图中的最下一层,而[4,5],[1,3]这样节点的value值是是其子节点之和,多以可以理解为在二维坐标系中是高于下面的节点的,其子节点都在它的左面,可能说的比较模糊,我也是想一会就明白了 1 #include<iostream> 2 #include<fstream> 3 4 using namespace std; 5 6 struct e{ 7 阅读全文

posted @ 2012-08-08 20:38 矮人狙击手! 阅读(342) 评论(0) 推荐(0) 编辑

上一页 1 2 3 4 5 6 7 8 9 ··· 12 下一页

导航