程序设计导引及在线实践——练习记录


初步打算是先练习,记录好的代码。有很多细节需要注意。练习网站是

http://bailian.openjudge.cn/

常见问题

  1. 固定数组不要开太小,不然测试容易Runtime Error
  2. 字符串转化为整数时,str[j] - 'A'挺好。
  3. 整数相除
  4. scanf输入字符遇到空格,%c被空格占用,_%c,即%c加一空格控制格式。遍历字符串,若以\n结尾,
    for (i = 0; str[i] != '\n'; i++)
  5. n组数,while(n--){},但是n--n就变了,可害苦我了,不这么玩了,还是我的for
  6. fgets会把换行一起读进去,字符串大小不仅要考虑‘\0’还有‘\n’

第二章 简单的计算题

2.2 棋盘上的距离(1657)

是规则推导模型的问题,不是模拟。象的规则,斜走,棋盘奇偶。还要考虑相同位置不走的情况。

2.3 校门外的树(2808)

如果马路长度 L 的值极大,比如是 40 亿,以至于无法开设这么大的 trees
数组,本题该如何解决?

2.4 填词(2801)

玩家需要把每个方格中填上一个字母使得每个单词都能在方格盘上找到

输入保证填词游戏至少有一组答案,这说明我们不必寻找单词所在的位置,只要去掉这些单词所占用的字母就可以了问题转化为给出一个字母的集合,从中去掉一些在给出单词中出现过的字母,将剩下的字母按字典序输出!

可以定义一个有 26 个元素的数组,分别记录在输入的矩形中,每个字母出现的次数,当读入单词时,将数组中对应到单词中的字母的元素值减一。处理完所有的单词后,将数组中的非 0 的元素对应的字母依次输出,数组元素的值是几,就输出几次该字母。

厉害了。化简问题,用下标表示字母,化简算法。

2.5 装箱问题(1017)

由大到小枚举考虑所有情况,但是一直WA。原来是最后一个向上取整写错了,气死。
向上取整的技巧,(c+3)/4

练习题
  1. 垂直直方图(2800)打印技巧
	n = max;
    for (i = 0; i < max; i++)
    {
        for (j = 0; j < 26; j++)
        {
            if (character[j] < n)
                printf("  ");
            else
                printf("* ");
        }
        printf("\n");
        n--;
    }
  1. 密码(2818):Time Limit Exceeded
    参考提示,数次映射后会变回本身,从而减少循环次数
    然后还是疯狂TLE,貌似要计算每一位的循环数,总体循环还是TLE,待完成
  2. 肿瘤面积(2713)
    就一个肿瘤???

第三章 数制转换问题

字符型数组存放

3.1 确定进制(2972)

k进制的各位必须小于k。但是好像不要做这个处理,WA可能是因为i=17的情况
利用数值范围判断字符串位数。

练习题
  1. 二进制转16进制(2798)
    每4位一输出。字符串长度可以到10000,转化成十进制不可取。
  2. 八进制小数(2765):进制的小数转换
    小数运算转化为整数运算,范围超过int如何处理。
    待完成。

第四章 字符串处理

4.3 487-3279(2974)
  1. 先全部转化成标准形式存起来再用strcmp排序和数数,比一开始就考虑重复次数简单。
  2. 书里对于字母映射,定了个映射数组
    char map[] = "22233344455566677778889999";
    比我各种if else不知道高到哪里去了。学习一个。数据结构啊。
  3. qsort很好要学会用,遇到Runtime Error,数组该大要大
  4. for (i = 0; i < n - 1; i++) strcmp(phone[i], phone[i+1]);,或者phone数组足够大,比n大
    小心越界。
  5. 这题做的我好苦,各种RE,WA,要素过多,心态小崩
练习题
  1. 密码(2818),诸位找周期,否则超时,做得我好苦
  2. W密码(2819),Runtime Error,考虑诸如数组越界、取模除数是否为0的情况,话说字符串长度为0也太搞笑了吧。总要考虑极端情况。
  3. 古代密码(2820):看hint好像是题目理解有问题,意思是同时映射和乱序,满射即可,不要理解成常见的顺序推移,问题转化为统计明文、暗文的字母频数。排序一下更明白。

第五章 日期和时间处理

5.3 日历问题

逐年逐月减掉,省去乱七八糟的换算,妙啊

5.5 时区间时间的转换(2966)

很多case就用数组!比if或者switch好

第六章 模拟

6.3 显示器

编程时设置一些标志的时候,要考虑一下是否可以直接用更有意义的东西将 0、1 这样的标志代替,妙啊

练习题
  1. 宇航员(1835):处理前方向、左方向和上方向,列举case太蠢了且容易出错。模拟的题是有规律模拟的。不要老想着枚举。另外
scanf("%s%d", d, &x);
switch (d[0]) {}

这样不错,省去了strcmp的麻烦。妙啊。

第七章 高精度计算

7.2 大整数乘法

先把每位相乘的结果存放好最后再诸位进位。字符串倒序存放成整型数组操作方便。

7.4 麦森数

求位数,log10。把p转化成二进制表示,不然3100000超时。

第八章 枚举

枚举要多筛选没用的情况,节约时间空间。

8.4 完美立方(2810)

枚举全部需要判断的四元组,储存立方值避免重复计算立方。

第九章 递归

递归好难啊。找出抽象的数量关系,再手动模拟确定结束条件

9.5 放苹果(1664)

所有不同的摆放方法可以分为两类:至少有一个盘子空着和所有盘子都不空。我们:可以分别计算这两类摆放方法的数目,然后把它们加起来。对于至少空着一个盘子的情况,则 N 个盘子摆放 M 个苹果的摆放方法数目与 N-1 个盘子摆放 M 个苹果的摆放方法数目相同,相当于一个盘子没用。对于所有盘子都不空的情况,则 N 个盘子摆放 M 个苹果的摆放方法数目等于 N 个盘子摆放 M-N 个苹果的摆放方法数目,因为放完 M-N 个苹果后再放 N 个必将全部放满。

9.6 红与黑(2816)

成给定一点,计算它所在的连通区域的面积。需要考虑的问题包括矩阵的大小,以及从某一点出发向上下左右行走时,可能遇到的三种情况:出了矩阵
边界、遇到’.’、遇到’#’。设 f(x, y)为从点(x,y)出发能够走过的黑瓷砖总数,
f(x, y) = 1 + f(x - 1, y) + f(x + 1, y) + f(x, y - 1) + f(x, y + 1)

9.7 八皇后(2754)

怎么递归呢?确定第一个皇后及其控制范围,八皇后变七皇后。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值