03 2014 档案
摘要:#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;}
阅读全文
摘要:分析:这是一个二维完全背包,首先要找到哪个属性是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],...
阅读全文
摘要:裸地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...
阅读全文
摘要:分析:可以转化为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--) ...
阅读全文
摘要:题意:给你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);当然全体是排好序。因为...
阅读全文
摘要:二分查找主要用于在一堆数中查找某一个数。。前提条件:(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]...
阅读全文
摘要:裸的最小生成树。。如果对最小生成树的算法还不是太熟的话。。推荐看看这个博客。。个人认为讲解的不错。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]...
阅读全文
摘要:并查集水题。。先来点并查集基础。。查找函数: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;}...
阅读全文
摘要:汉诺塔递推题,比汉诺塔多了一个限制条件,盘子只允许在相邻的柱子之间移动。分析:第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;#
阅读全文
摘要:汉诺塔问题。。不要思维定式。。想明白了很简单。。排列组合,不用管盘子大小,其实每一个盘子都可以放在三个柱子上。。所以公式是 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
阅读全文
摘要:汉诺塔问题变形题问题描述:在经典汉诺塔的基础上加一个条件,即,如果再加一根柱子(即现在有四根柱子a,b,c,d),计算将n个盘从第一根柱子(a)全部移到最后一根柱子(d)上所需的最少步数,当然,也不能够出现大的盘子放在小的盘子上面。注:1#include#define M 99999999int main(){ int i,n,x,min,f[65]; f[1]=1; f[2]=3; for(i=3;i<=65;i++) { min=M; for(x=1;x<i;x++) if(2*f[x]+pow(2,i-x)-...
阅读全文
摘要:经典汉诺塔系列的题。先回忆一下普通汉诺塔的解决方法:(1)将A上n-1个盘子借助C座线移到B座上;(2)把A座上剩下的一个盘移到C座上;(3)将n-1个盘从B座借助于A座移到C座上。本题求:n阶汉诺塔,上数第k个盘子的移动次数分析:第K个盘子的移动与第k个盘子上的盘子移动无关,所以问题转换为n-k+1阶汉诺塔中第一个盘子的移动次数。然后看上述三个步骤中,(2)中第K个盘子未移动,所以递推公式为:f(n) = 2 * f(n-1)由于问题已经转化成n-k+1阶汉诺塔,故所求通项f[n]=2^(n-k)。#include #include int main() { int c,n,k; ...
阅读全文

浙公网安备 33010602011771号