
程序设计导引及在线实践
文章平均质量分 55
苏子散人
爱古风,爱代码。
展开
-
poj1657 Distance on Chessboard
本题关键在于分析棋盘上王、后、车、象的行走规则。设起点坐标为(x1,y1),终点坐标为(x2,y2);dx=abs(x1,x2),dy=abs(y1-y2)。1. 王可以横、竖、斜走,每步一格所需最小步数为min(dx,dy)+abs(dx-dy)对于橘黄色三角所在的特殊位置,先竖着走再斜着走和两次都斜着走所用的步数是一样的2. 后可以横、竖、斜走,每步格数不限横、竖、斜1步走到,否则2步走到3....原创 2018-06-11 22:04:15 · 380 阅读 · 0 评论 -
百练2787 算24
用n个数计算24,第一步一定是先选取两个数进行某种运算,再将得到的结果和剩下的n-2个数构成n-1个数去算24。于是第一步操作后,问题变为和原问题形式相同但是规模减小(由n变为n-1)的新问题。这样的问题适合递归解决。#include<iostream>#include<cmath>using namespace std;#define eps 1e-6//注意浮...原创 2018-07-08 20:23:21 · 613 阅读 · 0 评论 -
百练2737 大整数除法
计算两个大整数相除的商。首先将字符串逆序转换成对应的整型数组,然后基本思想是做减法,从被除数里减去多少个除数,商就是多少。为了减的更快一些,可以先减去除数的10的ntimes倍数。如7564/23, 先减去23的100倍,发现可以减3次,余下646,于是商增加300。然后用646减去230,发现可以减2次,于是商增加20。最后用186减去23,发现可以减8次,因此最终商为328。关键是写一个大整数...原创 2018-06-20 14:58:20 · 386 阅读 · 0 评论 -
百练1011 Sticks
这是一道搜索题,用递归的方法枚举所有可能,但是要及早判断出有的局面不可行,从而推翻该局面,而不是在该局面下继续尝试,这就是剪枝。因希望棍子尽可能短,因此枚举棍子长度的范围为从最长的那根木棒的长度,到木棒长度和的一半。如果都不成功,那么只能把所有木棒拼成一根棍子。枚举的时候,不需要每个长度都尝试,对于不是木棒长度和的因子的长度,可以直接否定。这是最容易也是最强的剪枝。用一个二元组(R,M)表示当前状...原创 2018-07-09 10:44:07 · 220 阅读 · 0 评论 -
百练2757 最长上升子序列
此题是很经典的动态规划题目。#include<iostream>using namespace std;int main(){ int a[1001]; int n; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; int f[1001]; //f[i]表示以a...原创 2018-07-09 12:24:50 · 271 阅读 · 0 评论 -
百练1661 Help Jimmy
此题需要分成两种状态来规划:LeftMinTime[k]:从第k个平台的左端下落到地面的最短时间RightMinTime[k]:从第k个平台的右端下落到地面的最短时间如果平台k左端正下方有平台j,则必然会落到平台j上,从而需要求平台j的左右端下落到地面的最短时间。此题的wa点在于高度MAX,也就是如果两个平台之间的高度差大于MAX,则该条路是不可走的;还有就是如果落到平台边缘视为落到平台上,这样如...原创 2018-07-09 16:30:19 · 278 阅读 · 1 评论 -
百练2806 最长公共子序列
经典的动态规划题目:#include<iostream>#include<stdio.h>#include<cstring>using namespace std;int main(){ char s1[205],s2[205]; int f[205][205]; while(scanf("%s%s",s1+1,s2+1)&g...原创 2018-07-09 17:17:19 · 214 阅读 · 0 评论 -
百练4131 01背包
注意此题必须采用滚动数组的方法:因此需要注意内循环的顺序:#include<iostream>#include<stdio.h>#include<cstring>#include<algorithm>using namespace std;const int maxn=3500;int w[maxn];int v[maxn];int...原创 2018-07-09 20:38:06 · 273 阅读 · 0 评论 -
百练2748 全排列
递归:有的问题在解决时,可以先做一步操作,操作后的局面是和原问题形式相同但是规模变小的新问题,由新问题的答案可以推出原问题的答案,这样的问题,就可以使用递归解决。这种情况下使用递归,会不停地缩小问题的规模,直到问题缩小到某一规模后(称为满足了某个终止条件),就无法或者不必再递归缩小其规模,而是立即求出该最小问题的解,并且再往上层层推出最初原始问题的解。递归函数不能总是没完没了地调用自身,必须存在某...原创 2018-07-07 16:50:20 · 235 阅读 · 0 评论 -
百练2694 逆波兰表达式(递归求解)
逆波兰表达式的递归定义:1. 任何数都是逆波兰表达式2. +、-、*、/后面加上空格,再加上一个逆波兰表达式,再加空格,再加一个逆波兰表达式,形成一个逆波兰表达式。故可采用递归求解逆波兰表达式的值,类似编译原理中递归下降分析的思想:#include<stdio.h>#include<math.h>#include<stdlib.h>double exp(...原创 2018-07-07 18:04:32 · 806 阅读 · 0 评论 -
百练4132 四则运算表达式求值
要是学过编译原理这题就比较好懂了,但是不好想到。简单算术表达式的上下文无关文法为:exp--> exp addop term | termaddop--> + | -term--> term mulop factor | factormulop--> * | /factor --> (exp) | number将文法化成EBNF范式,然后采用递归下降的方式求解exp的...原创 2018-07-07 21:18:21 · 692 阅读 · 0 评论 -
百练4117 整数划分
#include<iostream>using namespace std;//对整数n进行划分,最大加数不超过m的划分数int f(int n,int m){ if(m==1) return 1; //最大加数不超过1的划分数只有一种,就是全为1 if(n<m) return f(n,n); if(n==m) return 1+f(n,m-1...原创 2018-07-08 15:54:44 · 329 阅读 · 0 评论 -
百练2980 大整数乘法
大数运算主要是先将字符串转换成整型数组,然后根据手工模拟运算过程。从最后一位开始向前运算,最后结果注意处理前导0和结果就为0的情况。#include<iostream>#include<stdio.h>#include<string.h>using namespace std;int main(){ char s1[200],s2[200];...原创 2018-06-19 17:53:48 · 223 阅读 · 0 评论 -
百练2706 麦森数
此题的关键是计算2^p,采用移位的方式不断计算p的二进制表示,进而通过乘以对应的2的次幂得到结果。 此外,此题用1个数组元素表示十进制的4位数字,即采用万进制(10000进制),提高高精度计算的速度。主要是实现高精度乘运算。此题也让我发现的我的codeblocks 16.01编译环境有问题orz。#include<stdio.h>#include<memory.h>#i...原创 2018-06-23 16:39:23 · 265 阅读 · 0 评论 -
百练2974
此题对重复电话号码进行计数并对各电话号码按照字典序升序输出,采用map一举两得。#include<iostream>#include<stdio.h>#include<string.h>#include<map>#include<string>using namespace std;char match[]="2223334...原创 2018-06-15 19:58:39 · 434 阅读 · 0 评论 -
百练2744
此题主要掌握常用的字符串处理函数:strlen: 计算字符串的长strncpy: 复制字符串的子串char* strncpy(char* dest, const char * src, size_t n );将source串的前n个字符复制到destination串中,返回结果与destination相同。strcpy: 复制整个字符串到另一个字符数组char* strcpy(char* dest...原创 2018-06-15 22:16:28 · 193 阅读 · 0 评论 -
百练2692 假币问题
一开始的思想就是能够根据天平的平衡情况标记出所有的真币,然后天平不平衡情况的硬币中肯定只有一枚假币,剩下的都是已经判断为真的真币,很明显这种想法在下面这组测试用例中不成立:ABCD EFGH evenIJ KA downJK AB down采用上面的思想无法判断出这组用例的结果。因此正确的思想是遍历所有可能的方案(24种),(x,w)表示假币编号为x,w表示假币比真币轻还是重。#include&l...原创 2018-06-24 22:18:38 · 687 阅读 · 0 评论 -
百练2964 日历问题
已知公元2000年1月1日是星期六,计算经过n天后的年月日和星期。由于2000年有366天,但是第一天已经过去,所以在计算时要注意2000年还剩365天。#include<stdio.h>#include<string.h>char s[7][10]={"Saturday","Sunday","Monday","Tuesday","Wednesday&quo原创 2018-06-17 19:25:58 · 228 阅读 · 0 评论 -
百练2746 约瑟夫问题
有n只猴子,从1开始报数,报到m的猴子离开,剩下的猴子接着从1开始报数。主要在于模拟整个过程。#include<stdio.h>int main(){ int n,m; int a[301]; while(scanf("%d%d",&n,&m)) { if(n==0 && m==0) ...原创 2018-06-18 15:45:25 · 197 阅读 · 0 评论 -
百练2950 摘花生
注意:此题要求采摘花生按照从大到小的顺序采摘,关键是处理采摘后能否回到大路上。数组下标从1开始便于求解,可以令大路的横坐标为0;否则从0开始,在如下代码块会出错:if(pi==0) pj=maxj;因为在大路上可以随便移动,纵坐标任意,但是在第一行上不能随便移动。再者就是地里没有花生了应该及时退出。#include<iostream>#include<cmath>#in...原创 2018-06-18 17:44:20 · 212 阅读 · 0 评论 -
百练2811 熄灯问题
1. 第2次按下同一按钮时,将抵消第1次按下产生的结果,所以每个按钮最多只需按下一次2. 各个按钮被按下的顺序对最终结果没有影响3. 对第1行中每盏亮着的灯,按下第2行中对应的按钮,就可以熄灭第1行中的全部灯。如此重复,就可以熄灭第2,3,4行的全部灯。最后判断这种按灯方式是否将第5行的灯也成功熄灭。...原创 2018-06-25 14:46:59 · 349 阅读 · 0 评论 -
百练2745 显示器
将数字表示成计算器显示的形式。一个计算器显示的数字由8笔画构成,因此记录每个数字(0-9)在每个笔画对应的形式。#include<stdio.h>#include<string.h>//记录每个数字的笔画char n1[11]="- -- -----";char n2[11]="| ||| ||";char n3[11]="||||| |||";char ...原创 2018-06-18 21:03:51 · 352 阅读 · 0 评论 -
百练2812 恼人的青蛙
此题关键是将所有点排序后,遍历每次确保被选中的两个点是一条青蛙路径上最先被踩踏的两个水稻。在遍历点的过程中,要注意青蛙能够从一侧进入稻田,沿着直线一直跳,直到最后跳出稻田,如果青蛙连着跳了4个点,该条直线上的第5点还在稻田中,但是青蛙没有踩踏,则该条路径不合法,不能记录青蛙当前最大的踩踏数是4,而应该记0。#include<stdio.h>#include<string.h&g...原创 2018-06-26 00:09:08 · 355 阅读 · 0 评论 -
百练1664 苹果装盘
此题是整数划分问题的扩展:f(m,n)表示m个苹果放在n个盘子的放法数目。如果m<n,则n-m个盘子永远为空,所以f(m,n)=f(m,m);如果m>=n,则有两种情况:若n个盘子至少存在一个为空,则f(m,n)=f(m,n-1);若n个盘子都不空,可以从每个盘子中都拿走一个苹果,不影响不同放法的数目,则f(m,n)=f(m-n,n);递归终止:当只有1个盘子或者没有苹果时,只有一种放...原创 2018-07-07 22:10:18 · 389 阅读 · 0 评论