算法
文章平均质量分 58
堕落的蚂蚁
IT码农
展开
-
leetcode:Recover Binary Search Tree
Two elements of a binary search tree (BST) are swapped by mistake.Recover the tree without changing its structure.Note:A solution using O(n) space is pretty straight forward. Could you devis原创 2014-12-22 23:12:19 · 431 阅读 · 0 评论 -
题目1370:数组中出校次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。输入:每个测试案例包括2行:第一行输入一个整数n(1第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]。输出:对应每个测试案例原创 2014-03-29 16:17:01 · 461 阅读 · 0 评论 -
杭电OJ 1007:Quoit Design
这个一个经典的利用分治算法解决的问题,这个题目其实是要求平面上很多点中距离最近的两个点的距离的一半(半径)。解决这个问题的思路是:(1)对所有的点按照x坐标从小到大排序。(2)按照x坐标将所有的点一分为二,分为左边的一半和右边一半。(2)分别求出左边一半和右边的一半的点的最小距离,假设最小距离分别为minl和minr。取minValue=min(minl,minr)。(3)对从low到原创 2014-03-29 09:06:14 · 632 阅读 · 0 评论 -
杭电OJ 1014:Uniform Generator
比较简单的一个题目,要注意输出的格式(对其格式以及空格等问题),附上AC代码:#include int main(){ int a,b,r,m,n; while(scanf("%d%d",&a,&b)!=EOF){ m = a;n = b; if(a < b){ a += b;b = a -b;a -= b; } while(b > 0){ r = a %原创 2014-03-29 15:56:44 · 558 阅读 · 0 评论 -
杭电OJ:1010 Tempter of the Bone
这是一道搜索的题目,题目很常规,需要注意的是剪枝函数,如果剪纸剪的不好就很容易超时。AC代码:#include char maze[8][8];int n,m,t;bool success;int go[][2]={ 1,0, -1,0, 0,1, 0,-1};void DFS(int x,int y,int time){ for(int i=0;i<4;i++){原创 2014-03-29 15:40:02 · 688 阅读 · 0 评论 -
杭电OJ 1011:Starship Troopers
这是一道树形DP问题,答案是参考网上的。第一次接触到这种题目,没什么头绪,看到别人的解答后豁然开朗。 有 n(1典型的树上背包问题定义状态 f[u][P] 表示用 P 个士兵占领以 u 为根节点的子树所能获得的概率最大值,状态转移就是一个树形DP过程,目标状态就是 f[1][m]。f[u][p] = max {f[u][p], f[u][p - k] + f[v][k] };其原创 2014-04-01 16:18:08 · 638 阅读 · 0 评论 -
杭电OJ 1098:Ignatius's puzzle
这个题目的难点不是编程,而是数学。f(x)=5*x^13+13*x^5+k*a*x=x(5*x^12+13*x^4+k*a),这个函数的形式直接就是费马小定理的形式费马小定理是数论中的一个重要定理,其内容为: 假如p是质数,且(a,p)=1,那么 a^(p-1) ≡1(mod p) 假如p是质数,且a,p互质,那么 a的(p-1)次方除以p的余数恒等于1对f(x)=x(原创 2014-04-03 10:50:56 · 577 阅读 · 0 评论 -
杭电OJ 1022:Train Problem I
这个题目主要就是模拟出栈和入栈,其实不难就是有点麻烦。话不多说,直接上代码:#include #include using namespace std;int main(){ int n;int in[10],out[10];stack S; int result[20];char t1[10],t2[10]; while(scanf("%d\n",&n)!=EOF){ whi原创 2014-03-24 09:41:57 · 410 阅读 · 0 评论 -
杭电OJ 1027:Ignatius and the Princess II
题目的大意就是求一串数字的全排列的第m小的排列,比如1,2,3是3个数的最小的全排列,1,3,2是次小的全排列。这个题目可以用STL的一个函数next_permutation,这个函数是用来生成一个全排列的下一个全排列,当然也可以自己写生成排列算法,生成一个全排列的下一个全排列的算法如下:(1)从数组最后一个开始往前找,假设后一个记为p,前一个记为pre,直到找到一个满足A[pre](2)原创 2014-03-23 14:32:17 · 636 阅读 · 0 评论 -
杭电OJ 1438:钥匙计数之一
这个题目主要是数学推理。假设one[i],two[i],three[i],four[i]分别表示一共有i个槽的情况下第一个槽为1、2、3、4的情况,Lock[i]表示有i个槽的情况下锁匙的个数,容易得到Lock[i] = one[i] + two[i] + three[i] + four[i]。另外可以知道one[i]和four[i]的情况是一样多的,因为对于所有的第一个槽为1的合法情况,如果原创 2014-03-27 21:58:30 · 569 阅读 · 0 评论 -
九度OJ 1532:棋盘寻宝扩展
题目描述:现在有一个8*8的棋盘,上面放着64个不同价值的礼物,每个小的棋盘上面放置一个礼物(礼物的价值大于0小于100),一个人初始位置在棋盘的左上角,每次他只能向下或向右移动一步,并拿走对应棋盘上的礼物,结束位置在棋盘的右下角。从棋盘的左上角移动到右下角的时候的,每次他只能向下或向右移动一步,并拿走对应棋盘上的礼物,但是拿到的所有的礼物的价值之和不大于一个限定值limit,请设计一个算原创 2014-04-29 20:48:28 · 482 阅读 · 0 评论 -
杭电OJ 1789:Doing Homework again
经典的贪心问题,先按照作业的扣除分数从大到小排序,如果分数相同则按截至日期从小到大排序。然后根据day判断哪些作业可以被安排。注意:for循环中如果存在一个作业符合条件就要跳出循环(因为每天只能安排一个作业)。C++代码:#include#includeusing namespace std;const int N=1001;struct homework{ int deadli原创 2014-03-11 13:55:03 · 578 阅读 · 0 评论 -
杭电OJ 1005:Number Sequence
这个题目如果使用数组或者递归都会爆栈,注意到题目中的数都是对7取余,所以相邻的两个数的组合最多有49中,所以最多49次循环就会从头开始循环,这是就可以不用继续执行了,然后将n对i取余,根据余数就可以得到结果。C++代码:#includeconst int N=55;int dp[N];int getRes(int A,int B,int n){ if(n==1||n==2) r原创 2014-03-06 19:52:50 · 831 阅读 · 0 评论 -
杭电OJ 1220:Cube
这纯粹是一道数学题目,推理如下: 给你一个正方体,切割成单位体积的小正方体,求所有公共顶点数<=2的小正方体的对数。公共点的数目只可能有:0,1,2,4.很明显我们用总的对数减掉有四个公共点的对数就可以了。 总的公共点对数:n^3*(n^3-1)/2(一共有n^3块小方块,从中选出2块)(只有两个小方块之间才存在公共点,我们从所有的小方块中任意选出两个,自然就确定了这两个小方块的公共点的原创 2014-03-13 19:46:11 · 488 阅读 · 0 评论 -
杭电OJ 1051:Wooden Sticks
这个题目的大意是有一个处理木材的机器,处理第一根木材的时候需要调整,后面的木材如果长度不小于前面的木材并且重量也不小于前面的木材则机器不需要重新调整,否则就需要调整,调整一次花费的时间为1,问机器最少要调整几次?这个问题其实可以转换为求最长递减子序列。转化过程:先对多所有的木材按长度从小到大排序,然后按重量求最长递减子序列,子序列元素的个数就是机器要调整的次数,因为这个序列中的元素是不可能排在原创 2014-03-08 11:58:15 · 709 阅读 · 0 评论 -
杭电OJ 1053:Entropy
这个问题的主要难点是构建huffman树,在构建huffman树的过程中可以使用优先队列,另外在计算总的编码长度的时候用了树的遍历算法。需要注意的是如果出现的字符只有一种,这种情况要单独考虑。下面的代码还给出了指针优先队列的用法(指针优先队列和值优先队列的用法不太一样)。C++代码:#include#include#includeusing namespace std;const原创 2014-03-08 14:42:33 · 636 阅读 · 0 评论 -
杭电OJ 1061:Rightmost Digit
这个题目要求n的n次方的最后一个数字,其实最后一个数字只与n的最后一个数字和多少次方有关系,由于N的值很大,所以不能直接相乘,会超时。应该采用二进制乘法。C++代码:#includeint main(){ int T,n; scanf("%d",&T); while(T--){ scanf("%d",&n); int res=1;int tmp=n%10; while(n)原创 2014-03-10 09:36:22 · 695 阅读 · 0 评论 -
杭电OJ 1060 :Leftmost Digit
C++代码:#include#includeusing namespace std;int main(){ long long T;double n; cin>>T; while(T--){ cin>>n; double a=n*log10(n); double b=a-(long long)a; int c=(int)pow(10.0,b); cout<<c<原创 2014-03-10 18:17:01 · 511 阅读 · 0 评论 -
和为S的两个数字
题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输入:每个测试案例包括两行:第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和。其中1 第二行包含n个整数,每个数组均为int类型。输出:对应每个测试案例,输出两个数,小的先输出。如果找不到,则输出“-1 -1”原创 2014-03-15 23:24:27 · 438 阅读 · 0 评论 -
杭电OJ 1023:Train Problem II
这个题目其实就是计算卡特兰数,但是由于数字比较大所以要用到大数运算,下面的大数代码是别人写的,自己懒得写了。#include #define MAX 54void Multiple(int n,int* des){ int i,k,temp1,temp2; temp1 = 0; for(k=MAX-1;!des[k];k--); for(i=0;i<=k;i++){ temp原创 2014-03-24 10:38:01 · 597 阅读 · 0 评论 -
杭电OJ 1207 :汉诺塔II
虽然本题只是在原来的汉诺塔的基础上增加了一个柱子,但是不能根据先将上面的n-2个圆盘通过C和D移动到B上,然后再将第n-1个盘子移动到C上,接着讲最后一个圆盘移动到D上(假设D是最终的位置),最后将上面的n-2个圆盘通过A ,C移动到D上,所以一共需要F[n]=2*F[n-2] + 3步;当nhttp://www.cnblogs.com/fanzhidongyzby/archive/2012/07原创 2014-03-25 11:03:13 · 877 阅读 · 0 评论 -
LeetCode : Multiply Strings 一种比较快速的方法
Multiply Strings Total Accepted: 10282 Total Submissions: 50489My SubmissionsGiven two numbers represented as strings, return multiplication of the numbers as a string.Note: The number原创 2014-07-26 22:46:17 · 481 阅读 · 0 评论 -
Leetcode Sqrt(x):牛顿迭代法和Quake-III中的神奇方法
关于牛顿迭代法就不多介绍了,原创 2014-07-12 22:08:49 · 715 阅读 · 0 评论 -
Leetcode : Search in Rotated Sorted Array
yuanti Suppose a sorted array is rotated at some pivot unknown to you beforehand.(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).You are given a target value to search. If found in the arra原创 2014-07-15 10:51:32 · 402 阅读 · 0 评论 -
LeetCode :Single Number II
这个题目的意思是:一个数组中所有的数字除了一个数字只出现一次外,其他的原创 2014-07-06 09:46:49 · 436 阅读 · 0 评论 -
二分查找,找到第一个符合条件的数字
下面的二分查找用于找到第一个符合条件的数字,如果原创 2014-10-23 22:35:44 · 1415 阅读 · 0 评论 -
编程之美2.8 找符合条件的整数
书上面讲的很好,程序也写得很巧妙,原创 2014-11-09 21:45:01 · 406 阅读 · 0 评论 -
leetcode : Interleaving String(DFS 和 DP)
Interleaving String Total Accepted: 21379 Total Submissions: 107884My SubmissionsQuestion Solution Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.原创 2014-12-22 10:32:17 · 486 阅读 · 0 评论 -
leetcode:Validate Binary Search Tree
Given a binary tree, determine if it is a valid binary search tree (BST).Assume a BST is defined as follows:The left subtree of a node contains only nodes with keys less than the node's key.Th原创 2014-12-22 17:40:30 · 430 阅读 · 0 评论 -
LeetCode :Letter Combinations of a Phone Number
原文参考地址:原创 2014-07-06 12:33:37 · 362 阅读 · 0 评论 -
LeetCode : Combination Sum
题目:Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.The same repeated number may be chosen from C unlimited n原创 2014-07-20 16:36:42 · 389 阅读 · 0 评论 -
杭电OJ 1030:Delta-wave
这是一个完全的数学题目,主要是找规律。仔细研究可以找到如下规律:1.关于给定一个n,求其所在的层。 1层:1个数,2层:3,3层:5,4层:7,……(等差,d = 2,a1 = 1,Sn = (a1 + an)/2 = n^2) 看最右边斜列1,4,9,16,……皆为平方数。 所以n所在的层为:ceil(sqrt(n))2.关于网上的左右斜列(或斜行)。原创 2014-03-25 09:06:16 · 486 阅读 · 0 评论 -
杭电OJ 1026:Ignatius and the Princess I
比较麻烦的一道题目,自己刚开始思路不清楚,原创 2014-04-06 10:59:27 · 641 阅读 · 0 评论 -
杭电OJ 1381 :Crazy Search
这个题目不难,主要是看一下map的用法和string类的构造函数的使用。C++代码:#include #include #include #include using namespace std;int main(){ int T,N,NC; string text; map Stat;//定义map对象 cin>>T; while(T--){ cin>>N>>NC原创 2014-03-26 17:35:19 · 542 阅读 · 0 评论 -
并查集与路径压缩
在并查集中我们先定义数组Tree[N],原创 2014-04-26 19:25:32 · 363 阅读 · 0 评论 -
九度OJ 题目1526:朋友圈(并查集)
题目描述:假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。假如:n = 5 , m = 3 , r = {{1 , 2} , {2 , 3} , {4 , 5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1、2、3属于一个朋友圈,4、5属于另一个原创 2014-04-26 19:10:01 · 741 阅读 · 0 评论 -
九度OJ 1531:货币面值
题目描述:小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在游戏中购买各种装备来提升自己。有一天,他突然很想知道这些纸币的组合不能表示的最小面额是多少,请聪明的你来帮助小虎来解决这个财政问题吧。输入:输入包含多个测试用例,每组测试用例的第一行输入一个整数N(N输出:对于每组测试用例,输出一原创 2014-04-27 09:25:36 · 502 阅读 · 0 评论 -
九度OJ 1529:棋盘寻宝
题目描述:现在有一个8*8的棋盘,上面放着64个价值不等的礼物,每个小的棋盘上面放置一个礼物(礼物的价值大于0小于1000),一个人的初始位置在棋盘的左上角,每次他只能向下或向右移动一步,并拿走对应棋盘上的礼物,结束位置在棋盘的右下角,请设计一个算法使其能够获得最大价值的礼物。输入:输入包含多个测试用例,每个测试用例共有8行8列,第i行的第j列的数字代表了该处棋原创 2014-04-26 19:36:42 · 403 阅读 · 0 评论 -
杭电OJ 1028:Ignatius and the Princess III
这是一个使用母函数的题目,之前听说过母函数,但是没有用过,后来查了一下资料,大概了解了一下,关于母函数的具体信息请参考:http://blog.csdn.net/lishuhuakai/article/details/8044431和http://www.matrix67.com/blog/archives/120两篇文章。C++代码:#include"iostream" using n原创 2014-03-05 20:31:32 · 582 阅读 · 0 评论 -
杭电OJ 1045:Fire Net
题目的数据量比较小,直接暴力搜索就可以过。C++代码:#includeint n,maxnum=0;char map[5][5];bool check(int row,int col){ int i,j; for(i=row;i>=0;i--){ if(map[i][col]=='O')return false; if(map[i][col]=='X')break; }原创 2014-03-11 10:11:02 · 623 阅读 · 0 评论