摘要: #include#includeusing namespace std;int f[1001], sum, m, n;struct node{ int x, y, w;}p[1001];bool cmp(const node &a, const node &b){ return a.w>n>>m, n) { for(int i=1; i>p[i].x>>p[i].y>>p[i].w; } kruskal(); } return 0;} 阅读全文
posted @ 2014-03-12 20:13 xtaq 阅读(127) 评论(0) 推荐(0) 编辑
摘要: 分析:这是一个二维完全背包,首先要找到哪个属性是wight,哪个是value。。根据题意,杀怪数和忍耐度是wight,属于背包。经验值是价值。。然后套用完全背包,只不过这个是二维背包,要再加入一个循环。。这个题要求的是剩余忍耐度。。所以第一个循环可以设置成忍耐度。。只要所求的经验值大于规定,就可跳出循环,简化代码。。#includeusing namespace std;int dp[110][110];int Max(int a,int b){ return a>b?a:b;}int main(){ int i, j, k, n, m, l, s, a[105], b[105],... 阅读全文
posted @ 2014-03-04 17:24 xtaq 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 裸地01背包。。。给出质量限制求最大可获得的价值。。直接贴代码:#includeusing namespace std;int main(){ int n, m; cin>>n>>m; int w[3500]={0}, d[3500]={0}; int f[26000]={0},i,j; for(i=0; i>w[i]>>d[i]; } for(i=0; i=w[i]; j--) { if(f[j-w[i]]+d[i]>f[j]) f[j]=f[j-w[i... 阅读全文
posted @ 2014-03-03 20:27 xtaq 阅读(175) 评论(0) 推荐(0) 编辑
摘要: 分析:可以转化为01背包。。解决这个问题需要两个步骤。。(1)留下5元钱去买最贵的菜。(要注意排除 m #includeusing namespace std;int max(int a, int b){ return a>b ? a : b;}int main(){ int n; while(cin>>n && n) { int i, j, m, c[1011], ma=0, f[1011], k; for(i=1; i>c[i]; if(ma>m; if(m=0; j--) ... 阅读全文
posted @ 2014-03-03 20:15 xtaq 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 题意:给你n个点的坐标,算出这些坐标可能组成多少个正方形。。分析:由几何知识我们可以推出,当知道一个正方形一条边两个点的坐标时,可以推出剩下两点的坐标。推导过程:公式推导:如图所示,正方形的四个点分别为(x1,y1),(x2,y2),(x3,y3),(x4,y4)假设一开始给出的点为(x1,y1),(x2,y2)且已排序根据全等三角形,可以得知2个蓝色△全等,2个红色△全等(注:此处也可推右边的正方形)所以可以推出x3=x2-(y2-y1); y3=y2+(x2-x1); x4=x1-(y2-y1); y4=y1+(x2-y1);当然全体是排好序。因为... 阅读全文
posted @ 2014-03-03 16:47 xtaq 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 二分查找主要用于在一堆数中查找某一个数。。前提条件:(1)这堆数要存储在数组中;(2)是有序的。。二分查找属于分治法。。可以用递归实现。。代码:int binarysearch(int array[], int low, int high, int target){ if (low > high) return -1; int mid = (low + high)/2; if (array[mid]> target) return binarysearch(array, low, mid -1, target); if (array[mid]... 阅读全文
posted @ 2014-03-02 20:08 xtaq 阅读(291) 评论(0) 推荐(0) 编辑
摘要: 裸的最小生成树。。如果对最小生成树的算法还不是太熟的话。。推荐看看这个博客。。个人认为讲解的不错。http://blog.csdn.net/fengchaokobe/article/details/7521780题没什么好说了。。最小生成求最小权值。。代码:#include#includeusing namespace std;int map[110][110], low[110], n;int prim(){ int sum=0, m=1, s=1, mark, minn, i; bool u[110]={0}; u[s]=1; for(i=1; imap[s][i]... 阅读全文
posted @ 2014-03-01 20:05 xtaq 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 并查集水题。。先来点并查集基础。。查找函数:intfind(inti){intt=i;while(bin[t]!=t) t=bin[t];returnt;} 没有路径压缩intfind(inti){int k,t; t=i; while(t!=bin[t]) t=bin[t]; while(i!=t) //修改路径---压缩 { k=bin[i]; bin[i]=t; i=k; } return i;} 带有路径压缩还有一个递归路径压缩查找:int find(int x){return father[x]-x ? father[x]=find(father[x]) : x;}... 阅读全文
posted @ 2014-03-01 19:50 xtaq 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 汉诺塔递推题,比汉诺塔多了一个限制条件,盘子只允许在相邻的柱子之间移动。分析:第1步:初始状态;第2步:把上面的n-1个盘移到第3号杆上;第3步:把第n个盘从1移到2;第4步:把前n-1个从3移到1,给第个盘让路;第5步:把第n个盘从2移到3;第6步:把前n-1个从移到3,完成移动;我们设f(n)为把n个盘从1移到3所需要的步数,当然也等于从3移到1的步数。看什么的图就知道,要想把第n个盘从1移到3,需要想把前n-1个从1移动3,再从3->1最后再1->3。而第n个盘要从1->2->3经历2步。∴f(n) = 3 × f(n-1) + 2;f(1) = 2;# 阅读全文
posted @ 2014-03-01 18:57 xtaq 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 汉诺塔问题。。不要思维定式。。想明白了很简单。。排列组合,不用管盘子大小,其实每一个盘子都可以放在三个柱子上。。所以公式是 3^n。。#include"stdio.h"__int64 dp[30];int main(){ int i; dp[0]=1; for(i=1;i<30;i++) dp[i]=dp[i-1]*3; int t; int n; scanf("%d",&t); while(t--) { scanf("%d",&n); printf("%I64d\n",dp[n]); } r 阅读全文
posted @ 2014-03-01 17:12 xtaq 阅读(153) 评论(0) 推荐(0) 编辑