算法积累
文章平均质量分 54
腿毛飘扬
这个作者很懒,什么都没留下…
展开
-
39级台阶
//如果每一步只能迈上1个或2个台阶,先迈左脚,然后左右交替,最后一步迈右脚,也就是 //说一共要迈偶数步。那么,上完39级台阶,有多少种不同的上法呢? // (0级) // 1 2 // 1 2 1 2 // 1 2 1 2 1 2 1 2 /原创 2015-02-01 16:46:02 · 258 阅读 · 0 评论 -
统计单词个数
#include int get_word_num(char* buf) { int n = 0; int tag = 1; char* p = buf; for(;*p!=0;p++){ if(*p==' ' && tag==0) tag=1; if(tag==1 && *p!=' ') { n++; tag=0; } } return n; } int原创 2015-02-01 16:52:51 · 239 阅读 · 0 评论 -
李白打酒
酒壶有酒2斗,逢店加一倍,遇花喝一斗。共遇店5次,遇花10次。已知最后一次遇到的 是花,正好把酒喝光。 可以把遇店记为a,遇花记为b。则:babaabbabbabbbb就是合理的次序。像这样的答案一共有多少呢? //回溯法 #include int count=0;//??? int shop,flower,wine; void backtrack(int t) { if(t=转载 2015-02-01 16:57:56 · 459 阅读 · 0 评论 -
16进制转8进制
//16进制转8进制 //思路:16进制转成2进制串,2进制串从后每3位转成8进制串 #include #include #define maxN 10 #define maxLength 100000 int main() { int i,j,k,m,n,len,temp,sum; char a[maxN][maxLength]; char *bi;//转换成2进制所存储的数组原创 2015-02-01 17:01:27 · 381 阅读 · 0 评论 -
石子合并问题
在一个圆形操场的四周摆放着n堆石子。 现要将石子有次序地合并成一堆。规定每次只能选择相邻的两堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。 利用贪心来做是错误的,贪心算法在子过程中得出的解只是局部最优,而不能保证使得全局的值最优。 需要通过动态规划算法来求出最优解 思路:设m(i,j)定义为第转载 2015-02-01 17:02:54 · 599 阅读 · 0 评论 -
KMP算法
//长度为n的主串T中匹配长度为m的子串P (n>=m)。 //匹配成功:存在P的每个字符依次和T中的一个连续字符序列相等 //输出主串中匹配串起始位置,匹配失败输出-1 //思路: //首先用O(m)的时间对子串进行预处理,可通过子串本身的特性判断出需要右移几位才是可能匹配的 //然后用O(n)的时间去完成匹配 //时间复杂度: O(m+n) #include #include //失原创 2015-02-01 16:49:34 · 231 阅读 · 0 评论 -
阶乘计算
#include #include const int maxn = 3000; int f[maxn]; int main() { int i,j,n; scanf("%d",&n); memset(f,0,sizeof(f)); f[0]=1; for(i=2;i<=n;i++) { //乘以i int c = 0; //每乘一个数的进位 for(j=0;j<ma转载 2015-02-01 16:56:58 · 344 阅读 · 0 评论 -
最大子段和
给定n个整数(可能包含负数)组成的序列,求该序列子段和的最大值。 #include #include //常规思路,暴力求解 /* int maxSum(int *arr,int n) { int i,j,k; int sum=0,thisSum,besti,bestj; //i,j分表代表起始位置和终止位置 for(i=0;i<n;i++) {原创 2015-02-01 17:12:14 · 363 阅读 · 0 评论 -
最优合并问题
给定k个排好序的序列s1,s2,…,sk,用2路合并算法将这k个序列合并成一个序列。 假设所采用的2路合并算法合并两个长度分别为m和n的序列需要m+n-1次比较。 试设计一个算法确定合并这个序列的最优合并顺序,使所需要的总比较次数最少。 //思路:贪心算法 #include #include int *sort(int *arr,int start,int end) { int转载 2015-02-01 17:14:23 · 2374 阅读 · 1 评论 -
最优装载问题
给定一艘容量为C的船,给定一批货物,货物i的重量是wi,要求在船不超重的前提下,将尽可能多的货物装上船。 //回溯法 #include int n,c; //货物的个数 和 船的容积 int cw; //已装总重量 int bestw; //最优解 int *w; void backtrack(int i) { if (i==n+1) { if原创 2015-02-01 17:15:33 · 613 阅读 · 0 评论 -
子集和问题
子集和问题的一个实例为。其中S={x1,x2,…,xn}是一个正整数的集合,c是一个正整数。 子集和问题判定是否存在S的一个子集S1,使得S1中所有元素的和为c。 问题分析:将问题的所有解空间进行构造,得到一棵二叉树。回溯法求解。 #include int i,n,c;//S中元素个数n 及 c的值 int sum=0,flag=0; int *S,*mark; voi原创 2015-02-01 17:10:29 · 1303 阅读 · 0 评论 -
最长公共子序列
#include #include char X[100],Y[100]; char res[100]; int k=0; int func(char x[],char y[],int i,int j) { int m,n; if(i==0 || j==0) { for(m=0;m<=i;m++) for(n=0;n<=j;n++) if(x[m]==y[n])原创 2015-02-02 09:28:07 · 289 阅读 · 0 评论 -
墓地雕像
在一个周长为10000的圆上等距离分布着n个雕塑。现在又有m个雕塑加入(位置可以随意放),希望所有n+m个雕塑在圆周上均匀分布。 这就需要移动其中一些原有的雕塑,要求n个雕塑移动的总距离最小。 输入包含多组数据,每组数据一行,包含两个整数n和m 输出仅一行,为最小距离,精确到10E-4 思路:确定一个原点--->其它点的位置便能确定---->所有点移到最近的目标---->无相同位置转载 2015-02-04 16:37:05 · 490 阅读 · 0 评论 -
n后问题
暴力求解 #include #include int place(int *arr,int n) { int i,j; for(i=0;i<n;i++) for(j=i+1;j<n;j++) if( arr[i]==arr[j] || abs(i-j)==abs(arr[i]-arr[j]) ) return 0; return原创 2015-02-01 16:50:42 · 285 阅读 · 0 评论 -
数字三角形问题
给定一个由n行数字组成的数字三角形,设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。 (0,0) (1,0) (1,1) (2,0) (2,1) (2,2) (3,0) (3,1) (3,2) (3,3) 思路:动态规划 动态方程: sum(i,j) = a(i,j) + max{sum((i+1),j) , sum((i+1),(j+1转载 2015-02-01 17:05:01 · 262 阅读 · 0 评论 -
活动安排问题
设有n个活动的集合E={1,2,3,…,n},所有的活动要求使用同一资源, 而在同一时间内只有一个活动能使用这一资源, 每个活动都有使用这一资源的开始时间si和结束时间fi,且si<fi。 目标:要在所给的活动中,找出最大的相容的活动子集合。 //贪心算法 #include void main () { int i,endTime; int n; int *s,*f,*exis原创 2015-02-01 16:55:29 · 319 阅读 · 0 评论 -
16进制转10进制
//十六进制转十进制 //思路:将16进制数展开,按数位依次操作,每次将前面的乘16,再加上当前数位的值。 #include #include int main() { int i,len,temp; unsigned long sum; char hex[8]; int hexNum[8]; scanf("%s",hex); len=strlen(hex); for(i=原创 2015-02-01 17:02:05 · 603 阅读 · 0 评论 -
最小重量机器问题
设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。 设wij 是从供应商j 处购得的部件i的重量,cij是相应的价格。 对于给定的机器部件重量和机器部件价格,编程计算总价格不超过d的最小重量机器设计。 输入 第一行有3 个正整数n ,m和d。接下来的2n 行,每行n个数。前n行是c,后n行是w。 输出 将计算出的最小重量,以及每个部件的供应商 样例输入 3 3转载 2015-02-01 17:13:00 · 407 阅读 · 0 评论 -
全排列
#include int count = 0;//数组中元素的个数 //全排列函数 void perm (char alph[],int start) { int i; char temp; if(count-start==2)//剩下两个元素时停止递归 { for(i=0;i<count;i++) printf("%c",alph[i]); putchar('\n'原创 2015-02-01 17:00:34 · 268 阅读 · 0 评论 -
突击战
你有n个部下,每个部下需要完成一项任务。第i个部下需要你花Bi分钟交待任务,Ji分钟后完成任务。 你需要选择交待任务的顺序,使得所有任务尽早执行完毕。 不能同时给两个部下交待任务,但部下可以同时执行他们各自的任务。 输入格式 包含多组数据,每组数据的第一行为部下的个数N(1 输入结束标志位N=0 输出格式 输出所有任务完成的最短时间 思路:使用贪心算法,按照J从大到小的转载 2015-02-01 17:06:49 · 772 阅读 · 0 评论 -
勇者砍恶龙
你的王国里有一条n个头的恶龙,你希望雇一些骑士把它杀死(即砍掉所有头)。 村里有m个骑士可以雇佣,一个能力值为x的骑士可以砍掉一个直径不超过x的头,且需要支付x个金币。 如何雇佣骑士才能砍掉恶龙的所有头,且需要支付的金币最少? 一个骑士只能砍一个头 输入格式 输入包含多组数据。每组数据的第一行为正整数n和m(1 以下n行每行为一个整数,即恶龙每个头的直径;以下m行每行为一个整数转载 2015-02-01 17:09:26 · 473 阅读 · 0 评论 -
数独
#include char sudoku[9][9]; char arr[9]; //输入 void inSudoku(char sudoku[9][9]) { int i; for(i=0;i<9;i++) scanf("%s",sudoku[i]); } //文件读取 void readSudoku(char sudoku[9][9]) { int i,j; FILE* f原创 2015-02-01 17:04:21 · 390 阅读 · 0 评论 -
01背包
//有n种物品,每种只有一个。第i种物品的体积为volume[i],为价值为value[i]。 //选一些物品装到一个容量为为V的背包中,使得背包内物品在总体积不超过V的前提下 //价值尽量大。1<<n<<100,1<<volume[i]<<C<<10000,1<<value[i]<<1000000 #include #define min(a,b) a>b?b:a #define max(a原创 2015-02-01 16:47:48 · 238 阅读 · 0 评论 -
汽车加油问题
一辆汽车加满油后可以行驶n公里,旅途中有加油站,设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。 输入:第一行有2个正整数n和k,表示汽车加满油后可行驶n公里,且旅途中有k个加油站。 接下来的1 行中,有k+1 个整数,表示每段之间的距离。 输出:输出编程计算出的最少加油次数。如果无法到达目的地,则输出”NoSolution”。 #include void fu原创 2015-02-01 17:00:19 · 742 阅读 · 0 评论 -
产生随机数
#include #include #include int Random(int m, int n) { int pos, dis; if(m == n) return m; else if(m > n) { pos = n; dis = m - n + 1; return rand() % dis + pos; }原创 2015-02-01 16:52:04 · 257 阅读 · 0 评论 -
分金币
//圆桌旁坐着n个人,每个人有一定数量的金币,金币总数能被n整除。每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等。 //求出被转手的金币数量的最小值。 //比如,n=4,4个人金币数目分别是1,2,5,4,只需转移4枚金币(第3个人给第2个人两枚,第2个人和第4个人分别给第1个人1枚)即可实现手中金币数目相等 //输入格式 //包含多组数据。每组数据第一行为整数n(n转载 2015-02-01 16:53:53 · 531 阅读 · 0 评论 -
排列的字典序问题
问题描述:n个元素共有n!个不同的排列。将这n个元素按照字典序排列 可以从0编号,直至n!-1。例如,当n=3时,6个不同排列的字典序值为: 0 1 2 3 4 5 123 132 213 231 312 321 编程任务:给定n以及n个元素的一个排列,计算出这个排列的字典序值; 给定一个字典序列,计算出该序列按字典序排列的下一个排列。 #原创 2015-02-01 16:59:02 · 464 阅读 · 0 评论 -
蚂蚁
一根长度为L厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为1厘米/秒。 当两只蚂蚁相撞时,二者同时掉头(掉头时间忽略不计)。 给出每只蚂蚁的初始位置和朝向,计算T秒之后每只蚂蚁的位置 输入格式 输入的第一行为数据组数。每组数据的第一行为3个正整数L,T,n(0 以下n行每行描述一致蚂蚁的初始位置,其中整数x为蚂蚁距离木棍左端的距离,字母表示初始朝向(L表示左,R表示右)转载 2015-02-04 18:53:00 · 2281 阅读 · 0 评论