- 博客(81)
- 资源 (9)
- 收藏
- 关注
原创 HDU 1085
#include using namespace std;int c1[10002],c2[10002],a[3]={1,2,5},b[3];int main(){ int n,m,i,j,k,sum; while(cin>>n>>m>>k,n+m+k) { b[0]=n;b[1]=m;b[2]=k; sum=0; for(i=0;i<3;i++) { sum+
2012-02-28 21:47:52 1239 2
原创 HDU 1028
#include using namespace std;const int lmax=125; int c1[lmax+1],c2[lmax+1];int main(){ int n,i,j,k; while (cin>>n) { for (i=0;i<=n;i++) { c1[i]=0; c2[i]=0; } for (i=0;i<=n;i+
2012-02-28 21:20:25 503
原创 HDU 1398
#includeusing namespace std;const int lmax=300;int c1[lmax+1],c2[lmax+1];int main(){ int n,i,j,k; int elem[17]={1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289}; while(cin>>n && n!=0)
2012-02-28 21:13:50 830
原创 HDU 1272
/分析解决方案很明显的一个用并查集解决的问题:如果只用一个根肯定满足要求,遍历数组即可 //如果某两个要合并的节点同根肯定会构成回路,不满足要求 这里用sign 标记是否出现了同根,分两种情况处理即可#include #include using namespace std;struct node { int parent; int weight;};
2012-02-28 13:01:41 668
原创 HDU 1863
#includeusing namespace std;#define N 9999999int map[101][101];int mark[101];bool visited[101];int n,m;void prim(){ int i,j,k,sum=0,min; int flag=1; memset(mark,0,sizeof(mark)); memset(vis
2012-02-28 12:38:42 493
原创 HDU 1213
#includeusing namespace std;const int maxn=1005;struct Node{ int parent;//保存父节点 int rank;//以此为父节点的人数}people[maxn];void init(int n){ int i; for(i=0;i<=n;i++) { people[i].parent=i; peop
2012-02-28 12:01:57 654
原创 HDU 1879
#include #include #include #include using namespace std ; #define MEM(a, v) memset (a, v, sizeof (a)) // a for address, v for value #define max(x, y) ((x) > (y) ? (
2012-02-28 11:01:20 846
原创 vi及缩进设置
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。1、vi的基本概念 基本上vi可以分为三种状态,
2012-02-26 22:49:29 13935 3
原创 HDU 1875
最小生成树的一种求法,关键还是判断两个点是否在一个回路上即并查集的运用#include #include#include#includeusing namespace std;int num[210];int pre[210];double length;struct edge{ int x, y; double w;}e[9999];void makeS
2012-02-26 22:04:00 1046 2
原创 prim最小生成树模板
int minTree(int n){ int i,j; memset(v,0,sizeof(v)); v[0]=1; sum=0; for(i=1;i<n;i++) { min=max; for(j=0;j<n;j++) { if(!v[j]&&map[0][j]<min) { min=map[0][j]; flag=j; } }
2012-02-26 20:17:00 1769 1
原创 HDU 1102
#include#include#includeconst int max=0x7ffffff;int map[101][101],min,v[101],n,x,y,sum,flag;void Reset(int n){ int i,j,m; memset(map,0,sizeof(map)); for(i=0;i<n;i++) { for(j=0;j<n;j++)
2012-02-26 20:16:09 640
原创 HDU 1301 %*C显示威力
最小生成树#include#include#includeconst int max=0x7ffffff;int map[27][27],min,v[27],n,dis,m,sum,flag;char cx,cy;void Reset(int n){ int i,j; map[n][n]; memset(map,0,sizeof(map)); for(i=0;i<n-
2012-02-26 19:55:24 620
原创 HDU 1116
这个题目要运用到欧拉路得相关知识,并且也要并查集,题目说的是:给你n个单词,要你判断这些单词能不能首尾相连。理解题目意思后,进行转化,输入字符串,提取首位字母作为下标来表示两节点的出现,以及相对应节点入度和出度的增加,转化为并查集的应用即可。那么从可以想象一幅由首位字母节点构成的图,当且仅当图是一条欧拉回路或者欧拉通路的时候,才能满足题目的要求,至于欧拉回路和欧拉通路的判定可以总结为如下:1)
2012-02-26 19:21:33 1583
原创 HDU 1233 还是畅通工程
#include#include#includeconst int MAX=100000000;int map[101][101],min,sum;int main(){ int i,j,n,x,y,m,v[101],flag,dis; while(scanf("%d",&n),n) { map[n][n]; memset(map,0,sizeof(map)); m
2012-02-26 18:24:38 567
原创 HDU 1232 畅通工程(与1856类似 )
这个题目也是典型的最小生成树算法的利用,不同于其他的题目就在于其它要求的是要添加的边的最少数目,使得任意两点都有联系,利用并查集算法 ,在题目已经给出的map基础上,统计两棵树相并的次数,即使要添加的路径的最少数目。#include#includeint father[1001],tot;int find(int x){ int r=x; while(r!=fat
2012-02-26 14:06:21 517
原创 HDU 1856
题目大意:老师选小男孩参加一个项目。要求选上的小男孩都能够直接或间接地相互认识。给你多对数,每对表示这两个小男孩是直接地相互认识,求出老师最多能选到多少个小男孩。最简单最基本的并查集。#includeusing namespace std;const MAXN =10000005;struct Node{ int parent;//保存父亲结点 int rank;//从此小男孩为父
2012-02-26 13:34:17 672
转载 并查集 (Union-Find Sets)
如果:给出各个元素之间的联系,要求将这些元素分成几个集合,每个集合中的元素直接或间接有联系。在这类问题中主要涉及的是对集合的合并和查找,因此将这种集合称为并查集。 链表被普通用来计算并查集.表中的每个元素设两个指针:一个指向同一集合中的下一个元素;另一个指向表首元素。 链结构的并查集 采用链式存储结构,在进行集合查找时的算法复杂度仅为O(1);但合并集合时的算法复杂
2012-02-26 13:12:09 1073
转载 并查集
并查集的学习告一段落,整理总结一下与大家共勉~ 并查集:(union-find sets)是一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数、最小公共祖先、带限制的作业排序,还有最完美的应用:实现Kruskar算法求最小生成树。其实,这一部分《算法导论》讲的很精炼。 一般采取树形
2012-02-26 12:51:23 7432
转载 并查集知识
并查集:(union-find sets)一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。并查集的精髓(即它的三种操作,结合实现代码模板进行理解):1、Make_Set(x) 把每一个元素初始化为一个集合初始化后每一个元素的父亲节点
2012-02-26 12:25:36 822
原创 HDU 2159
二维完全背包,第二层跟第三层的要顺序循环;(0-1背包逆序循环);状态可理解为,在背包属性为 {m(忍耐度), s(杀怪个数)} 里最多能得到的经验值,之前的背包牺牲体积,这个背包牺牲忍耐度跟个数注意: 最后扫的时候 外层循环为忍耐度,内层循环为杀怪个数,因为题目要求出剩余忍耐度最大,没有约束杀怪个数,一旦找到经验加满的即为最优解;状态转移方程为: f[j][l]=max(f[j][l],
2012-02-25 23:27:20 1246
原创 HDU 1203
#includeint a[1010];double b[1010],f[10010];double Min(double x,double y){ if(x<y) return x; else return y;}int main(){ freopen("1203.txt","r",stdin); int n,m,i,j; while(scanf("%d%d",
2012-02-25 22:07:06 1287
原创 HDU 1176 !
状态表示:dp[i,j]为j秒时在i位置的最大值//问题描述为:求从f[0][5]到f[T][]的一条路径,使得总和最大状态转移:i=0 dp[0][j] += Max(dp[0][j+1], dp[1][j+1]); i=10 dp[10][j] += Max(dp[10][j+1], dp[9][j+1]); i=1-9 dp[i
2012-02-25 20:11:23 846
原创 HDU 1171 ?
题目大意:hdu的计算机要分成两个学院,现在有n种物品,价值为ai的有bi个,要求把这些东西分成价值总和最为接近的两份,如果不能平分,大的在前面。#include using namespace std;int V[51];int M[51];int bst[125005];int main (){ int N; while ( scanf ( "%d",&N ),
2012-02-25 19:34:16 1090
原创 HDU 1069
#include#include#includestruct rect{ int x; int y; int z;}r[100];int bubblesort(struct rect* r,int n){ int i,j,t=n; struct rect temp; for(i=0;i<n;i++) { for(j=0;j<n-i-1;j++) { i
2012-02-25 17:45:11 847
转载 hdu题目分类
1001 这个就不用说了吧1002 简单的大数1003 DP经典问题,最大连续子段和1004 简单题1005 找规律(循环点)1006 感觉有点BT的题,我到现在还没过1007 经典问题,最近点对问题,用分治1008 简单题1009 贪心1010
2012-02-25 15:51:27 5491
原创 1069 qsort你这是什么状况,printf一下个别结构体的值发生变化?
#include#include#includestruct rect{ int x; int y; int z;}r[32];struct sh{ int s; int height;}s[100];int cmp(const void *lhs,const void *rhs){ struct sh *a=(struct sh*)lhs; struct sh
2012-02-25 13:27:12 846
原创 HDU 2571
#includeint a[22][1010],f[22][1010];int max(int x,int y,int z){ if(x>=y&&x>=z) return x; else if(y>=x&&y>=z) return y; else if(z>=x&&z>=y) return z;}int main(){ int n,m,t,i,j,k,c; sca
2012-02-25 11:17:00 836
原创 HDU 2602
#include#include#define M 1010int a[M],b[M],n,v;int f[M];int max(int x,int y){ if(x<y) return y; else return x;}void pack(int cost,int weight){ int i; for(i=v;i>=cost;i--) { f[i]=
2012-02-25 00:09:25 590
转载 背包九讲
背包问题九讲 v1.0目录第一讲01背包问题第二讲 完全背包问题第三讲 多重背包问题第四讲 混合三种背包问题第五讲 二维费用的背包问题第六讲 分组的背包问题第七讲 有依赖的背包问题第八讲 泛化物品第九讲 背包问题问法的变化附:USACO中的背包问题前言本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这
2012-02-24 19:41:58 529
原创 HDU 2870 最大子矩阵,联系1505, 1506
题目意思:w x y z 可以转化,求最大子矩阵。思路:枚举后转换为 hdu 1505 hdu 1506 的情况。可以转化为a的有:w,y, z可以转化为b的有:w,x, z可以转换为c的有:x, y, z所以a, w, y, z一组b, w, x, z一组c, x, y, z一组分别dp#include #include using
2012-02-23 22:03:06 947
原创 HDU 1505
这题是HDU1506 的加强版,只要把算出以i 行为底能达到的最到的最大高度,再扫描每一行,就转化为 HDU1506 的问题了,即算出以此点为最低点能两边延伸的最大距离,最大延伸距离乘以该点的高度就是面积了,HDU 2870 则是此题的加强版#include#include#define M 1005int a[M][M],l[M],r[M];int main(){ int t,i
2012-02-23 21:48:12 2482
原创 HDU 1506
【题目大意】 给出n(n 【解题思路】 对于每一块木板,Area=height[i]*(j-k+1) 设其中任一块x, j=height[i]; 找j,k成为关键。 一般方法肯定超时,[cpp:firstline[1]] view plaincopyFOR i:=1 TO n
2012-02-21 16:08:39 552
转载 程序猿装B指南
《程序猿装B指南》一.准备工作“工欲善其事必先利其器。”1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好。一个用来查资料,一个用来写代码。总之要显得信息量很大,效率很高。 2.椅子不一定要舒服,但是一定要可以半躺着。 3.大量的便签,各种的颜色的,用来记录每天要完成的事务,多多益善。沿着电脑屏幕的边框,尽量贴满,显出有很多事情的样子。 4.
2012-02-21 13:02:24 554
原创 HDU 1159 最长公共子序列
f(i,j)= {f(i-1,j-1)+1 (a[i]==b[j])max(f(i-1,j),f(i,j-1)) (a[i]!=b[j]) 由于f(i,j)只和f(i-1,j-1), f(i-1,j)和f(i,j-1)有关, 而在计算f(i,j)时, 只要选择一个合适的顺序, 就可以保证这三项都已经计算出来了, 这样就可以计算出f(i,j). 这样一直推到f(len(a),len(b))就
2012-02-21 12:33:01 672
原创 HDU 1231 自己做的,改天优化一下 类似题1003
#includeint main(){ int n,a[10000],b[10000],sum,temp,max=-1,i,first,last;// freopen("1231.txt","r",stdin); while(scanf("%d",&n),n) { int t=0; temp=0; first=0; last=0; max=-1; for(i=0
2012-02-21 01:05:07 490
原创 HDU 1684
题址:http://acm.hdu.edu.cn/showproblem.php?pid=18640—1背包,把每张发票当一个物品, 其中,发票中有单项大于600的或者总额大于1000的,这张发票扔掉不要,也就是不加入物品的行列。整理出每张发票的总额,作为这件物品的价值也作为容量(相当于物品的体积),放到容量为q的背包中,这就是标准的0—1背包了;转移方程:f[j]=max(f[j],
2012-02-20 22:53:52 605
原创 HDU 2955
http://acm.hdu.edu.cn/showproblem.php?pid=2955dp题关键还是写出转移方程。dp[j] 表示偷得 j 块钱的时候不被抓的概率;那么方程就可以这样写了: dp[j] = max( dp[j], dp[ j - mm[i] ] * (1-pp[i]) );#include#includedouble dp[10000];int mm[1
2012-02-20 15:07:40 1255
原创 HDU 1087
#includeint main(){ int n,i,j,a[1000],b[10000],maxb,maxnum; while(scanf("%d",&n),n) { maxnum=0; for(i=0;i<n;i++) { scanf("%d",&a[i]); b[i]=a[i]; } for(i=0;i<n;i++) { b[i]=a[i
2012-02-20 14:16:37 455
原创 HDU 1181
#include #include int main() { freopen("1081.txt","r",stdin); const int size = 101; int Max,sum; int N,i,j,k,val,a[size][size]; while (scanf("%d",&N)!=EOF) {
2012-02-20 13:39:16 417
转载 HDU 2094 拓扑
#include#include#include#includeusing namespace std;int main(){freopen("2094.txt","r",stdin);int n,i,t;string b,e;sets;set::iterator it;mapm;map::iterator iter;while(cin>>n
2012-02-19 18:23:51 455
计算机视觉:一种现代方法(第二版)清晰文字版(英文版)
2013-03-14
线性规划与网络流题解
2012-09-26
OpenCV 2 Computer Vision Application Programming Cookbook 全
2012-06-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人