随笔分类 - 算法
摘要:将问题的各状态之间的转移关系描述为一个图,则深度优先搜索遍历整个图的框架为:Dfs(v) {if( v 访问过)return;将v标记为访问过;对和v相邻的每个点u: Dfs(u);}int main() {while(在图中能找到未访问过的点 k) Dfs(k);}例题:POJ1164The C...
阅读全文
摘要:数字三角形(POJ1163)Description73 88 1 02 7 4 44 5 2 6 5在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或右下走。只需要求出这个最大和即可,不必给出具体路径。...
阅读全文
摘要:汉诺塔问题古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求输出移动的步骤。汉诺塔问题递...
阅读全文
摘要:DescriptionIn Korea, the naughtiness of the cheonggaeguri, a small frog, is legendary. This is a well-deserved reputation, because the frogs jump thro...
阅读全文
摘要:看了Matrix67神牛的位运算简介及实用技巧(三):进阶篇(2),下面是我写的C语言代码和我的思考作补充: 1 //By LYLtim 2 3 #include 4 5 const unsigned upperlim = (1 > 1);16 }17 } else an...
阅读全文
摘要:有N个石子,每个石子重量Qi;按顺序将它们装进K个筐中;求一种方案,使得最重的筐最轻。样例:N=9,K=39 7 5 6 8 4 3 2 716 19 16最轻的最重筐为19思路:二分搜索(PS:这就是传说中的“二分答案”?)IOI中国国家集训队2005论文《参数搜索的应用》中有详细分析,这里我就不多说了,下面是我的代码。 1 //2011.11.06 2 //By LYLtim 3 4 #include 5 #include 6 7 size_t N, K; 8 unsigned *Q, sum; 9 10 void Init(void)11 {12 size_t i;13 ...
阅读全文
摘要:1、统计一个无符号整数的二进制表示中1的个数,函数原型是int countbit(unsigned int x);。/*Count the number of 1-bits in a positive number.**By LYLtim*/int CountBit(unsigned x){ x = (x & 0x55555555) + ((x >> 1) & 0x55555555); x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x & 0x0F0F0F0F) + ((
阅读全文
摘要:1、本节的折半查找算法有一个特点:如果待查找的元素在数组中有多个则返回其中任意一个,以本节定义的数组int a[8] = { 1, 2, 2, 2, 5, 6, 8, 9 };为例,如果调用binarysearch(2)则返回3,即a[3],而有些场合下要求这样的查找返回a[1],也就是说,如果待查找的元素在数组中有多个则返回第一个。请修改折半查找算法实现这一特性。//By LYLtim#include<stdio.h>#define LEN 8int a[LEN] = { 1, 2, 2, 2, 5, 6, 8, 9 };int Search(int k){ int start
阅读全文
摘要:===== 真正强的东西来了! =====二进制中的1有奇数个还是偶数个我 们可以用下面的代码来计算一个32位整数的二进制中1的个数的奇偶性,当输入数据的二进制表示里有偶数个数字1时程序输出0,有奇数个则输出1。例 如,1314520的二进制101000000111011011000中有9个1,则x=1314520时程序输出1。var i,x,c:longint;begin readln(x); c:=0; for i:=1 to 32 do begin c:=c + x and 1; x:=x shr 1; end; writeln( c an...
阅读全文
摘要:在一组随机排列的数中找出第k小的,这个元素称为k-th Order Statistic。能想到的最直观的算法肯定是先把这些数排序然后取第k个,时间复杂度和排序算法相同,可以是Θ(nlgn),但它也有平均情况下时间复杂度是Θ(n)的算法,将快速排序算法稍加修改就可以解决这个问题: 1 /* 2 **Find out the K-th small number of a set of random numbers with O(n) 3 **2011.10.25 4 **By LYLtim 5 */ 6 7 #include<stdio.h> 8 #include<stdlib.
阅读全文
摘要:定义一个二维数组:int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0,};它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。程序如下://By LYLtim#include<stdio.h>#include<stdlib.h>const char Di[4] = {0,1,0,-1}, Dj[4] = {1,0,-1,0};char maze[5][5] = { 2,
阅读全文
摘要:定义一个二维数组:int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0,};它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。程序如下://By LYLtim#include<stdio.h>#include<stdlib.h>const char Di[4] = {0,1,0,-1}, Dj[4] = {1,0,-1,0};char maze[5][5] = { 2,
阅读全文
摘要:普通的筛法就不多说了,今天动了点脑筋,对普通的筛法做了点常数优化,主要是利用素数除了2以外全是奇数,那偶数就能排除掉不用再管了,再进一步优化就是只需排除素数的所有奇数倍。时间复杂度好像是O(N+1/4logNlogN)?感觉好像不对啊,求指导。。。>_<C语言代码://By LYLtim #include<stdio.h>#include<math.h>int main(void) { unsigned i, j, n = 100, n_sqrt = sqrt(n), sum = 0; char isprime[n + 1]; //初始化数组,除了2以外,偶
阅读全文
摘要:1.快速排序//By LYLtimvoid swap(int *a, int *b){ int t = *a; *a = *b; *b = t; }void QSort(int l, int r){ int lp = l, rp = r, m = (l + r) >> 1; while (lp a[m]) rp--; if (lp > 1; sort(start, mid); sort(mid+1, end); merge(start, mid, end); }}3.希尔排序//By LYLtimvoid ShellSort(int a[], unsigned n){ uns
阅读全文

浙公网安备 33010602011771号