while()与string::length()的使用错误 原因就是 s.length()返回的unsigned int,不能和signed int直接进行比较。当j==-1时,发现while()循环进不去了!
动态迷宫(回溯法) 比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向。蒜头君发现对他来说很难找到能使得他最快到达目的地的路线,这时聪明的蒜头君便想到了万能的你,来解决这个问题。注意:蒜头君只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且蒜头君登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,蒜头君从来不在楼梯上停留。,地图中不会出现两个相连的梯子。表示的楼梯在一开始是水平方向。输出一个整数,表示到达目标的最短时间。表示的楼梯在最开始是竖直方向,
宠物小精灵之收服(动态规划) 对于每一个野生小精灵而言,小智可能需要使用很多个精灵球才能收服它,而在收服过程中,野生小精灵也会对皮卡丘造成一定的伤害(从而减少皮卡丘的体力)。如果小智选择了收服,那么一定会扔出能够收服该小精灵的精灵球,而皮卡丘也一定会受到相应的伤害;现在已知小智的精灵球数量和皮卡丘的初始体力,已知每一个小精灵需要的用于收服的精灵球数目和它在被收服过程中会对皮卡丘造成的伤害数目。行,每一行代表一个野生小精灵,包括两个整数:收服该小精灵需要的精灵球的数量,以及收服过程中对皮卡丘造成的伤害。的野生小精灵也不会被小智收服。
派(分治法) 个朋友会来参加我的派对,每个人会拿到一块派(必须一个派的一块,不能由几个派的小块拼成;我的朋友们都特别小气,如果有人拿到更大的一块,就会开始抱怨。因此所有人拿到的派是同样大小的(但不需要是同样形状的),虽然这样有些派会被浪费,但总比搞砸整个派对好。当然,我也要给自己留一块,而这一块也要和其他人的同样大小。蒜头君的生日要到了!输出每个人能得到的最大的派的体积,精确到小数点后三位。之间的整数,表示每个派的半径。,表示派的数量和朋友的数量。个不同口味、不同大小的派。,半径不等的圆柱体。第一行包含两个正整数。
静态迷宫 判断是否能走出去 其中 ‘S’ 表示蒜头君的位置,’*‘表示墙,蒜头君无法通过,’.‘表示路,蒜头君可以通过’.'移动,'T’表示迷宫的出口(蒜头君每次只能移动到四个与他相邻的位置——上,下,左,右)。一天蒜头君掉进了一个迷宫里面,蒜头君想逃出去,可怜的蒜头君连迷宫是否有能逃出去的路都不知道。看在蒜头君这么可怜的份上,就请聪明的你告诉蒜头君是否有可以逃出去的路。输出一个字符串,如果蒜头君可以逃出迷宫输出"yes",否则输出"no"。第一行输入两个整数 n和 m,表示这是一个 n×m 的迷宫。
至少需要几驾飞机 题目:已知每个飞机只有一个油箱,飞机之间可以相互加油(注意是相互,没有加油机)一箱油可供一架飞机绕地球飞半圈。问题:为使至少一驾飞机绕地球一圈回到起飞时的飞机场,至少需要出动几驾飞机?(所有飞机从同一机场起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场)。思路:一驾飞机自己能飞半圈,且辅助飞机可以从两个方向出发,因此只需要考虑让目标飞机在1/4处满油即可。如果只有一驾辅助飞机,最多能让目标飞机在1/6处满油。假设为A、B、C,其中飞机A绕地球飞一圈,B、C为辅助飞机。
找众数(可能有多个) 使用分治法找出所有的众数,首先将输入元素从小到大进行排序,然后找到与a[mid]相等的数的范围a[mid_l..mid_r]。如果l~mid_l的长度大于等于mid_l~mid_r的长度,需要在l~mid_l范围内继续找,如果mid_r~r的长度大于等于mid_l~mid_r的长度,需要在mid_r~r中继续找。:使用sort()对输入序列从小到大进行排序,找到与a[mid]相等的数的范围a[mid_l..mid_r],然后进行判断(因为可能有多个众数,所以是。
最小“不重复数”(相邻两位不相等) 题目:设定N是一个正整数,求比N大的最小“不重复数”,这里的不重复是指没有两个相等的相邻位,如1102中的11是相等的两个相邻位,故不是不重复数,而12301是不重复数。:考虑到N可能很大,所以使用字符串来接收输入。要求比N大的最小不重复数,需要从N+1开始。编写函数判断高精度数是否是重复数,以及实现高精度数加1。
大数阶乘求末尾0的个数 在阶乘的计算中,偶数(含有因数2)的出现频率显然高于5的倍数的出现频率。1~n个数中,每隔5,出现一个质因数含5的数,即n/5(需要向下取整)个,分别是5,10,15,20,:用一个一维数组a存放阶乘值,将阶乘值的个位数存放于数组的最后一个元素a[N]中,十位数放在a[N-1]中,最高位放在a[1]中。初始值应该为1,即a[N]=1,a[1..N-1]=0。这n/5个数中,例如25、50、75中不止一个5,有两个5,也是每隔5出现一个,共有(n/5)÷5个……×n所得数的末尾有多少个0。
判断是否是变位词 直接简单地统计两个单词的各个字母的次数,需要两个长度为52的数组(区分字母大小写),来存放各自的字母出现次数,并且统计好了之后还需要比较这两个数组是否相同。题目:给定两个单词,判断这两个单词是否是变位词。如果两个单词的字母完全相同,只是位置有所不同,则称这两个单词为变位词。只需要一个数组,存放的是两个单词的字母出现次数的差,差为0,证明是字母出现的次数一样。(注意,具体实现还需要考虑字母大小写):判断是否为变位词,只需要分别统计两个单词的各个字母的次数,如果各个字母出现的次数一样,即为变位词。
一次快排拆成两个表 题目:设表A={a1,a2,…,an},将A拆成B和C两个表,使A中值大于等于0的元素存入表B中,值小于0的元素存入表C中,要求表B和C不另外设置存储空间而利用表A的空间。:首先将A表中的第一个元素存到变量a中,把第一个元素置为0,进行一趟快速排序。然后,将0变成原来的a。如果a小于0,则归到C表中,a大于等于0,归到B表中。:值小于某个数的在左边,值大于某个数的在右边,和快排十分类似。因此,如果第一个数为0,第一趟快排的结果就是左边的值都小于0,右边的都大于等于0。
去重(要求移动次数较少,相对次序不变) 利用指针j,指向当前没有重复元素数组的最后一个元素,即R[0]~R[j]中的元素都不重复。因此,j刚开始指向R[0]。从R[1]开始遍历数组继续寻找与R[0]~R[j]不重复的元素。题目:设计算法,在数组R[n]中删除重复的元素,要求移动元素的次数较少,并使剩下元素间的相对次序保持不变。如果在找到重复数字后,将后面的数全部前移覆盖掉该重复数字,需要大量的移动次数。对于重复出现的数字,j保持不变。然后i++,继续访问下一个元素。
单链表相加 先用头插法创建单链表(目的是为了将加数逆序),然后用两个指针分别指向两个单链表,直到有一个单链表遍历完,再把另一个剩下的部分放到结果单链表中,需要注意的是,不能直接照搬,可能会有进位,甚至需要再创建一个结点(因为结果的长度最大为max(s1,s2)+1)。最后,将结果单链表逆序(使用头插法建立答案单链表),打印输出即可。设两个加数的长度分别为s1,s2,最后的和的长度s最大可以取到max(s1,s2)+1。得到的和也是逆序的,因此最后需要将。题目:用单向链表表示十进制数,求两个正整数的和。
升序数组两两不相等 复杂度分析:最坏时间复杂度为O(n):可能每次a[mid]都等于mid+1,此时需要遍历整个数组;平均时间复杂度为O(logn):平均情况下,T(n)=T(n/2)+O(1);空间复杂度为O(logn):递归调用的深度为logn。题目:给定一个排好升序的数组A[1],A[2],…一个升序且值都不相等的数组,如果第一个数大于右下标(数组最后一个数的下标),或最后一个数小于左下标,则这个数组里一定没有满足题意的数。复杂度分析:最坏时间复杂度为O(n),平均时间复杂度为O(n);空间复杂度为O(logn)。
动态规划使用最少张数的货币找钱 思路:当只用面值为s[1], s[2],…问题:设有n种不同面值的货币,存于数组s[1..n]中。现用这些货币来找钱,各种货币使用的个数不限。C[i][j]=min(C[i][j-s[i]]+1,C[i-1][j]),当j>=s[i]C[i][j]=0x3f3f3f3f,当i=0,j!C[i][j]=C[i-1][j],当j
100层楼两个玻璃球找临界楼层所需要的次数 max(i,1+F[n-i])表示第一次从第i层楼扔,如果碎了,临界楼层一定在1~i层,但是现在只有一个玻璃球了,所以只能从1楼一层层往上找,直到i-1层。如果没碎,临界楼层一定在i+1~n层,共有n-i层,因为现在有两个玻璃球,所以和只有一个球那样找,有两个玻璃球找的次数为F[n-i],加上第一次扔的1次,共1+F[n-i]次。对于第n层楼,F[n]=min(max(1,1+F[n-1]),max(2,1+F[n-1]),max(3,1+F[n-3]),…,max(n-1,1+F[1]))。